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

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


      class Solution {
      public int longestConsecutive(int[] nums) {
      if(nums.length==0)return 0;
       Map<Integer, Integer> map=new HashMap<>();
      int ans=1;
      for(int i:nums){
      if(!map.containsKey(i)){
      if(map.containsKey(i-1) && map.containsKey(i+1)){
      int len=map.get(i-1)+map.get(i+1)+1;
      if(ans<len)ans=len;
       map.put(i-1-map.get(i-1)+1,len);
       map.put(i+1+map.get(i+1)-1,len);
       map.put(i,-1);
       }else if(map.containsKey(i-1)){
      int len=map.get(i-1)+1;
      if(ans<len)ans=len;
       map.put(i-1-map.get(i-1)+1,len);
       map.put(i,len);
       }else if(map.containsKey(i+1)){
      int len=map.get(i+1)+1;
      if(ans<len)ans=len;
       map.put(i+1+map.get(i+1)-1,len);
       map.put(i,len);
       }else{
       map.put(i,1);
       }
       }
       }
      return ans;
       }
      }
  
 

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

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

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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