解题思路:
我的想法是:排序—剔重—找最大连续数
这个做法其实时间复杂度没到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;
}
}
运行结果: