zoukankan      html  css  js  c++  java
  • 128. Longest Consecutive Sequence

    最长连续区间,如果可以SORT就太容易了。

    SORT的目的是把连续的放到一起,便于我们遍历,我们可以手动完成这个过程。。

    用MAP,先全都加进去,然后遍历原数组,往大小2个方向找,比较长度,找到了要REMOVE到,要不以后重复寻找了。

    做了一般突然感觉不需要MAP,SET就可以,因为KEY和VALUE始终一样的。。。。

    public class Solution 
    {
        public int longestConsecutive(int[] nums) 
        {
            if(nums.length <= 1) return nums.length;
            
            Map<Integer,Integer> map = new HashMap<Integer,Integer>();
            
            for(int i:nums) map.put(i,i);
            int res = 1;
            for(int i = 0; i < nums.length;i++)
            {
                if(map.containsKey(nums[i]))
                {
                    int max = 1;
                    int smaller = nums[i]-1;
                    int larger = nums[i]+1;
                    
                    while(map.containsKey(smaller))
                    {
                        max++;
                        map.remove(smaller--);
                    }
                    while(map.containsKey(larger))
                    {
                        max++;
                        map.remove(larger++);
                    }
                    
                    res = Math.max(res,max);
                    
                }
            }
            
            return res;
        }
    }
    


    二刷。

    找最长连续序列。

    建一个MAP,扫一遍数组加进去,这样就知道哪些数字有哪些没有了。

    然后重新遍历数组,选一个往大找,往小找,找到就长度 + +,然后从MAP里删除相应的数字,前后都找不到了就更新。。

    Time : O(n) 遍历了2次
    Space : O(n) map

    public class Solution {
        public int longestConsecutive(int[] nums) {
            if (nums.length <= 1) return nums.length;
            
            Map<Integer, Integer> map = new HashMap<>();
            
            for (int i : nums) {
                map.put(i, i);
            }
            
            int res = 0;
            
            for (int i : nums) {
                if (map.containsKey(i)) {
                    int larger = i + 1;
                    int smaller = i - 1;
                    int max = 1;
                    
                    while (map.containsKey(larger)) {
                        map.remove(larger ++);
                        max ++;
                    }
                    while (map.containsKey(smaller)) {
                        map.remove(smaller --);
                        max ++;
                    }
                    res = Math.max(res, max);
                }
            }
            
            return res;
        }
    }
    

    三刷。

    屎上最容易HARD难度的题。

    不知道为什么一刷二刷用的是map而不是set.

    Time: O(n) + O(n)

    public class Solution {
        public int longestConsecutive(int[] nums) {
            if (nums.length <= 1) return nums.length;
            
            Set<Integer> set = new HashSet<>();
            
            for (int i: nums) {
                set.add(i);
            }
            
            int res = 0;
            
            for (int i : nums) {
                int temp = i;
                if (!set.contains(temp)) continue;
                int smaller = i - 1;
                int larger = i + 1;
                
                while (set.contains(smaller)) {
                    set.remove(smaller --);
                }
                
                while (set.contains(larger)) {
                    set.remove(larger ++);
                }
                
                res = Math.max(res, larger - smaller - 1);
                
            }
            return res;
        }
    }
    
  • 相关阅读:
    第七章 防火墙和网络地址转换
    第六章 系统配置:DHCP和自动配置
    VLOOKUP函数的用法
    orcad 里误给元件添加了属性,如何删除
    文件夹无法删除提示找不到该项目怎么办
    网址
    OrCAD16.6中对比两份DSN文件的方法
    cadence allegro pcb模块设计复用
    Allegro Desgin Compare的用法与网表比较
    转:office 2016最新安装及激活教程(KMS)
  • 原文地址:https://www.cnblogs.com/reboot329/p/5894793.html
Copyright © 2011-2022 走看看