leetcode128 最长连续序列

举报
兔老大 发表于 2021/04/26 00:10:39 2021/04/26
【摘要】 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为4 思路:map记录某个连续序列端点的最大长度。 对于数字i,如果已经存在,跳过。 否则: 如果有端点i-1和i+1,合并...

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

示例:

输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为4

思路:map记录某个连续序列端点的最大长度。

对于数字i,如果已经存在,跳过。

否则:

如果有端点i-1和i+1,合并。

如果只有一边,和本数字合并。

如果相邻数字无端点,自己的长度是1

(你也可以合并的时候移除报废的端点,但是更慢)


  
  1. class Solution {
  2. public int longestConsecutive(int[] nums) {
  3. if(nums.length==0)return 0;
  4. Map<Integer, Integer> map=new HashMap<>();
  5. int ans=1;
  6. for(int i:nums){
  7. if(!map.containsKey(i)){
  8. if(map.containsKey(i-1) && map.containsKey(i+1)){
  9. int len=map.get(i-1)+map.get(i+1)+1;
  10. if(ans<len)ans=len;
  11. map.put(i-1-map.get(i-1)+1,len);
  12. map.put(i+1+map.get(i+1)-1,len);
  13. map.put(i,-1);
  14. }else if(map.containsKey(i-1)){
  15. int len=map.get(i-1)+1;
  16. if(ans<len)ans=len;
  17. map.put(i-1-map.get(i-1)+1,len);
  18. map.put(i,len);
  19. }else if(map.containsKey(i+1)){
  20. int len=map.get(i+1)+1;
  21. if(ans<len)ans=len;
  22. map.put(i+1+map.get(i+1)-1,len);
  23. map.put(i,len);
  24. }else{
  25. map.put(i,1);
  26. }
  27. }
  28. }
  29. return ans;
  30. }
  31. }

我真的不知道还能怎么优化了。

一些小优化基本没用,我试过了,如果有大变动的做法可以告诉我哈。

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/103407905

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。