leetcode线性表总结
经常使用的STL和数据结构
经典题型--分类总结
hash_map相关
128. 最长连续序列
给定一个未排序的整数数组
nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。采用O(n)的解决方案:
思路1: set-遍历nums,对于每一个nums[i],对外进行扩张,…num[i-1]…num[i+1]…查看是否都在数组中,直到不能扩张为止,
对于匹配的过程,暴力的方法是 O(n) 遍历数组去看是否存在这个数,但其实更高效的方法是用一个哈希表unordered_map存储数组中数,这样查看一个数是否存在即能优化至 O(1)的时间复杂度。
同时考虑到同一连续序列向两边扩张的结果是相同的,所以我们增加一个访问标记,去重
unordered_map<int,bool> flags . flags.find(k)!=flags.end()表明在该集合中, flags[k]==true表明它属于某个连续的子序列中,不用要再扩张
时间复杂度:O(n), 空间复杂度:O(n)
思路2:本身查找的过程类似于聚类,采用并查集,find,union..利用unordered_map<int,int> map用来存储
(参考leetcode sheet)
594.最长和谐子序列
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1
利用map存储时,按照key有序排列,map<int,int> count, count[k]表示k在原数组中出现的次数[注意map只能利用key下标或者迭代器遍历]
如果pre_it->first == later->first-1,则可以构成和谐子序列,计算长度
二分法查找
153.寻找旋转排序数组中的最小值
154.寻找旋转排序数组中的最小值 II
33.搜索旋转排序数组
81. 搜索旋转排序数组 II
刷题心得,这类题目特点:在每个分段序列中都是有序的,前面的最小值大于(等于)后半的最小值。
实际套路题,利用二分,只需分析清楚 在每种比较条件下,应该走哪个分支 [注意下标的开闭区间]