力扣100题哈希-最长连续数

119 阅读2分钟

题目:最长连续数

地址:leetcode.cn/problems/lo…

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

暴力操作(已超时)

    public static int longestConsecutive(int[] nums) {
        if(nums.length==0) return 0;
        // 思路:冒泡排一下序,然后循环比较 nums[i+1]-nums[i]==1
        for (int i = 0; i < nums.length-1; i++) {
            for (int j = i+1; j <nums.length ; j++) {
                if(nums[i]>nums[j]) {
                    int temp = nums[i];
                    nums[i]=nums[j];
                    nums[j]=temp;
                }
            }
        }
        int max=-1;
        int temp=1;
        for (int i = 0; i < nums.length-1; i++) {
            if(nums[i+1]==nums[i]) continue;
            if(nums[i+1]-nums[i]==1) {
                temp++;
            }else {
                if(temp>max) {
                    max=temp;
                }
                temp=1;
            }
        }
        if(temp>max) max=temp;
        return max;
    }

hash方法

思路:

通过set集合,判断集合中有无 value-1的值是否存在,如果没有,将当前数据保存,遍历所有集合数据,判断有无当前数+1的value存在,一直循环,定义一个统计数值,longestStreak,与max进行最大值比较得出结果

    public static int longestConsecutive(int[] nums) {

        // 创建一个set集合,无序,不可重复,将数组存入集合中,自动去重
        Set<Integer> set = new HashSet<>();
        for(int num : nums) {
            set.add(num);
        }
        // 定义一个参数,为返回值,防止[]的出现,初始化参数为0;
        int max = 0;

        // 通过set集合,判断集合中有无 value-1的值是否存在,如果没有,将当前数据保存,遍历所有集合数据,判断有无
        // 当前数+1的value存在,一直循环,定义一个统计数值,longestStreak,与max进行最大值比较得出结果

        for(int num :set) {
            if(!set.contains(num-1)) {
                int current = num;
                int longestStreak=1;
                while(set.contains(current+1)) {
                    current+=1;
                    longestStreak+=1;
                }
                max = Math.max(max,longestStreak);
            }
        }
        return max;
    }

解决问题花费时间 : 1 h (花费时间太长了)