• 128.Longest Consecutive Sequence


    题目链接

    题目大意:给出一个数组,找出其中连续数值最多的长度。例子如下:

    法一:o(nlgn)。先排序,然后遍历一遍,查找连续数值,一旦不连续,则更新ma。代码如下(耗时1ms):

     1     public int longestConsecutive(int[] nums) {
     2         if(nums.length == 0) {
     3             return 0;
     4         }
     5         //排序
     6         Arrays.sort(nums);
     7         int cnt = 1, ma = 1;
     8         //逐一遍历
     9         for(int i = 1; i < nums.length; i++) {
    10             //去除重复值
    11             if(nums[i] == nums[i - 1]) {
    12                 continue;
    13             }
    14             //如果连续
    15             else if(nums[i] == nums[i - 1] + 1) {
    16                 cnt++;
    17             }
    18             //一旦不连续,更新ma和cnt
    19             else {
    20                 if(cnt > ma) {
    21                     ma = cnt;
    22                 }
    23                 cnt = 1;
    24             }
    25         }
    26         //由于可能整个数组一直连续,所以最后还应该再判断一下
    27         if(cnt > ma) {
    28             ma = cnt;
    29         }
    30         return ma;
    31     }
    View Code

     法二:o(n)。利用hashmap,键值对是<nums[i],总连续个数>。具体代码如下(耗时18ms):

     1     public int longestConsecutive(int[] nums) {
     2         HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
     3         int res = 0;
     4         for(int i = 0; i < nums.length; i++) {
     5             //如果已经存在,则继续遍历
     6             if(map.containsKey(nums[i])) {
     7                 continue;
     8             }
     9             //找到当前值左连续的数值个数
    10             int left = map.containsKey(nums[i] - 1) ? map.get(nums[i] - 1) : 0;
    11             //找到当前值右连续的数值个数
    12             int right = map.containsKey(nums[i] + 1) ? map.get(nums[i] + 1) : 0;
    13             //计算当前值总连续的数值个数
    14             int sum = left + right + 1;
    15             //更新到map中
    16             map.put(nums[i], sum);
    17             //找最大值
    18             res = Math.max(res, sum);
    19             //这个是重点!!!更新左连续和右连续的数值个数,但是为啥不就近更新呢?比如说nums[i]-1,而要更新那么远的?
    20             map.put(nums[i] - left, sum);
    21             map.put(nums[i] + right, sum);
    22         }
    23         return res;
    24     }
    View Code
  • 相关阅读:
    4月19日 疯狂猜成语-----第五次站立会议 参会人员:杨霏,袁雪,胡潇丹,郭林林,尹亚男,赵静娜
    prototype
    angularJs scope的简单模拟
    angularjs DI简单模拟
    洗牌算法
    深入探索 TCP TIME-WAIT
    Logitech k480 蓝牙键盘连接 ubuntu 系统
    在 centos6 上安装 LAMP
    vlc 播放器的点播和广播服务
    Linux 文件系统及 ext2 文件系统
  • 原文地址:https://www.cnblogs.com/cing/p/8806664.html
Copyright © 2020-2023  润新知