解题思路:
我的想法是:排序—剔重—找最大连续数
这个做法其实时间复杂度没到O(n)但是也通过了
提交代码:
class Solution {
public int longestConsecutive(int[] nums) {
if(nums.length==0) return 0;
Arrays.sort(nums);
// remove the duplicate
int p1=0,p2=1;
while(p2<nums.length) {
int flag=nums[p1];
while(p2<nums.length&&nums[p2]==flag)
p2++;
if(p2<nums.length) {
nums[++p1]=nums[p2++];
}
}
int i=1,cnt=1;
while(i<=p1) {
int curCnt=1;
while(i<=p1&&nums[i]==nums[i-1]+1) {
curCnt++;
i++;
}
if(curCnt>cnt) cnt=curCnt;
i++;
}
return cnt;
}
}
运行结果:

然后还有另外一种做法用了hashmap,耗时是O(n),但是OJ实际运行下来居然比我的还耗时,有点搞不懂。
提交代码:
class Solution {
public int longestConsecutive(int[] nums) {
Map<Integer,Integer> map=new HashMap<>();
int res=0;
for(int n: nums) {
if(!map.containsKey(n)) {
int left=map.containsKey(n-1)?map.get(n-1):0;
int right=map.containsKey(n+1)?map.get(n+1):0;
int curLen=left+right+1;
res=Math.max(curLen, res);
map.put(n,curLen);
map.put(n-left, curLen);
map.put(n+right, curLen);
}
}
return res;
}
}
运行结果:

本文探讨了寻找最长连续子序列的两种算法实现,一种基于排序和去重的方法,另一种利用哈希表实现O(n)时间复杂度。通过对比两种算法的优缺点,帮助读者理解不同场景下选择合适算法的重要性。
891

被折叠的 条评论
为什么被折叠?



