• 128. Longest Consecutive Sequence


    一、题目

      1、审题

      

      2、分析

        给出一个无序数组,求数组中存在的最长连续的数字序列的个数。

    二、解答

      1、思路: 

        方法一、

          将数组排序后统计连续数值序列的个数。

       public int longestConsecutive(int[] nums) {
        
            int len = nums.length;
            if(len < 2)
                return len;
            Arrays.sort(nums);
            int max = 1;
            int tmp = 1;
            for (int i = 1; i < len; i++) {
                if(nums[i] == nums[i-1])
                    continue;
                if(nums[i]== nums[i-1] + 1) {
                    tmp++;
                    max = Math.max(tmp, max);
                }
                else
                    tmp = 1;
                
            }
            return max;
        }

        方法二、

          通过创建一个 Map 存储当前值的连续序列个数。

          每次存入新值时,一定要更新此值的边界数值的 value。

        public int longestConsecutive2(int[] nums) {
            
            int res = 0;
            HashMap<Integer, Integer> map = new HashMap<>();
            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 sum = left + right + 1;
                    map.put(n, sum);
                    
                    res = Math.max(res, sum);
                    
                    // extend the length to the boundary(s) of the sequence
                    map.put(n - left, sum);
                    map.put(n + right, sum);
                }
                else 
                    continue;
            }
            return res;
        }

      方法三、

        采用 Set 去重,而且可以直接在 Set 中查找向左向右延伸的连续数值的个数。

        public int longestConsecutive(int[] nums) {
            int len = nums.length;
            if(len < 2)
                return len;
            
            Set<Integer> set = new HashSet<>();
            for(Integer num: nums) 
                set.add(num);
            
            int max = 1;
            for(int num: nums) {
                if(set.remove(num)) {
                    int val = num;
                    int sum = 1;
                    while(set.remove(val-1))
                        val--;
                    sum += num - val;
                    
                    val = num;
                    while(set.remove(val+1))
                        val++;
                    sum += val - num;
                    
                    max = Math.max(max, sum);
                }
            }
            return max;
        }
  • 相关阅读:
    hibernate 使用hibernate 的注解做多对一双向映射
    JBPM学习笔记
    在测试Hibernate的一对多双向关联映射时
    js定时三秒后自动跳转页面
    struts2 的验证框架
    hibernate 双向一多对关联 删除一端时级联删除多端
    JPA 一些常用的东西
    Python 基础语法
    设计一个带有getmin功能的栈,保证时间复杂度在O(1)
    数据结构栈模拟队列
  • 原文地址:https://www.cnblogs.com/skillking/p/9751853.html
Copyright © 2020-2023  润新知