zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    线程池略略观
    spring-mvc的工作原理
    openstack cinder-backup流程与源码分析
    为何说只有 1 种实现线程的方法?
    经典排序算法原理解析与优劣对比
    Java中List和ArrayList的区别
    openstack-taskflow 组件记录
    递归:如何利用递归求解汉诺塔问题?
    登录MySQL提示ERROR 1045 (28000)错误解决方法
    回归JavaScript基础(九)
  • 原文地址:https://www.cnblogs.com/cing/p/8806664.html
Copyright © 2011-2022 走看看