【算法分析与设计】数字连续的最长序列

2024-01-09 16:56:28

题目

给定一个未排序的整数数组?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

思路

第一思路是:先将他们排序,之后找到最长的一段连续数字之后返回长度即可。emmm看着还是比较简单

实际书写遇到的问题

他会有多个数相同的情况,这个一般是会影响我们判断长度的就需要去重,自然就是用Set集合

之后怎么将Set集合转化为数组呢?

最笨的方式一个一个取出来,然后依次装入数组排序。不好,空间利用率低。

苦思冥想emmmm..............

可以直接在原来 的num中判断。当出现重复的数时直接跳过即可。判重还是用set.add(),他会返回一个boolean显示是否加入成功。

算法流程图

?代码实现

class Solution {
   public int longestConsecutive(int[] nums) {
       if(nums.length == 0) {
           return 0;
       }
       // 用于判定元素是否重复
       Set<Integer> set = new HashSet<>();
       int length = 1;
       int maxLength = 1;
       // 排序
       Arrays.sort(nums);
       for(int i =1; i< nums.length; i++) {
           // 当元素存在时, 保持length不变。 
           if( ! set.add(nums[i])) {
               continue;
           }
           // 连续的元素: 翻译下:就是nums[i-1] + 1 = nums[i]
           if(nums[i-1] + 1 == nums[i]) {
               length ++;
               // 当出现多串连续元素时, 取最大length: 。
               maxLength = Math.max(length, maxLength);
           }else{
               length = 1;
           }
           
       }
       return maxLength;
   }
}

执行结果:

时间23ms, 空间63.37MB?

?

文章来源:https://blog.csdn.net/m0_62645012/article/details/135481757
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。