给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9
序列不是子串,子串要求连续,而子序列要求不改变相对位置即可,本题只要求元素的值连续,而不要求下标连续。
如果对它尝试排序复杂度是多少
用set?set内置排序,也是排序。那就unordered_set,向左向右分别find ++
伪代码:
扫描添加到unorder set里
for num in set:
while(num++ exist) count++;
while(num-- exist) count++;
扫描了很多重复元素,有没有办法单向扫描,避免重复,找出其中最大的,或者最小的?
本身是一段一段的存在,只扫一个方向的话,就是靠跳过哪些某个方向包含在set中的元素
举例,往大的方向扫,那么就要求执行的这个位置的数是它所在的连续区间里最小的,如果还有比它小1(一定得是1)的存在,那就直接跳过,只扫那些比它大的。扫到不存在为止
要点:
1.unset怎么构造的,使用了nums的迭代器。
2.unset的查询某个元素是否存在的策略可以用find,返回迭代器和end进行比较,或者是使用count查询存在的个数,这在当每个元素只会出现一次时是一样的
class Solution { public: int longestConsecutive(vector<int>& nums) { unordered_set<int> unset(nums.begin(), nums.end());int historyMax = 0; for (auto& num : unset){ int count = 1; if(unset.count(num-1) == 0){ int s = num; while(unset.count(++s) == 1) count++; historyMax = max(historyMax, count); } } return historyMax; } };
标签:count,set,nums,++,序列,num,128,最长,unset From: https://www.cnblogs.com/synapse331/p/17680188.html