中文题目
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
示例 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
提示:
0 <= nums.length <= 104
-109 <= nums[i] <= 109
进阶:可以设计并实现时间复杂度为 O(n)
的解决方案吗?
注意:本题与主站 128 题相同: https://leetcode-cn.com/problems/longest-consecutive-sequence/
通过代码
高赞题解
我总结了剑指Offer专项训练的所有题目类型,并给出了刷题建议和所有题解。
在github上开源了,不来看看吗?顺道一提:还有C++、数据结构与算法、计算机网络、操作系统、数据库的秋招知识总结,求求star了,这对我真的很重要?
$\Rightarrow$通关剑2
排序 时间复杂度O(nlogn)
思想就很质朴,但是肯定是过不了面试的
int longestConsecutive(vector<int>& nums) {
size_t len = nums.size();
if(len == 0) return 0;
sort(nums.begin(), nums.end());
int inclen = 1, ans = 1;
for(int i = 1; i < len; i++) {
if (nums[i] == nums[i - 1] + 1) inclen++;
else if (nums[i] == nums[i - 1]) continue;
else inclen = 1;
ans = max(ans, inclen);
}
return ans;
}
时间复杂度为 O(n)
用hash存起来,遍历的时候找后面如果有找找找,然后更新最大长度,但是这样还不如排序
360 ms 30.2 MB
代码
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> s;
for(const int& num : nums) {
s.insert(num);
}
int ans = 0;
for(int& num : nums) {
if(s.find(num - 1) != s.end())
continue;
int cnt = 1;
while(s.find(num + 1) != s.end()) {
cnt++;
num++;
}
ans = max(ans, cnt);
}
return ans;
}
};
优化
执行用时:48 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:30.2 MB, 在所有 C++ 提交中击败了100.00%的用户
上面拉夸的原因是做了很多重复的计算,比如
1,2,3,4,5,6
每个都要往后看到6,太蠢了
因此,我们选择看过就删除,过河拆桥
int longestConsecutive(vector<int>& nums) {
unordered_set<int> s;
for (int i = 0; i < nums.size(); i++) {
s.insert(nums[i]);
}
int ans = 0;
while (!s.empty()) {
int now = *s.begin();
s.erase(now);
int l = now - 1, r = now + 1;
while (s.find(l) != s.end()) {
s.erase(l);
l--;
}
while(s.find(r) != s.end()) {
s.erase(r);
r++;
}
l = l + 1, r = r - 1;
ans = max(ans, r - l + 1);
}
return ans;
}
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
4264 | 8900 | 47.9% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|