🚩传送门:牛客题目
力扣题目

题目

给定无序数组[NC]95. 数组中的最长连续子序列 - 图1,返回其中最长的连续序列的长度(要求值连续,位置可以不连续)。

例如 **3,4,5,6** 为连续的自然数

要求:空间复杂度 [NC]95. 数组中的最长连续子序列 - 图2,时间复杂度 [NC]95. 数组中的最长连续子序列 - 图3

解题思路:排序

因为数组是无序的,如果要想找出最长的连续序列(这里序列的顺序可以打乱),我们最容易想到的就是先对数组进行排序,然后再查找。

[NC]95. 数组中的最长连续子序列 - 图4

复杂度分析

时间复杂度: [NC]95. 数组中的最长连续子序列 - 图5 ,该方法需要遍历一次数组所有元素,但是需要一次排序数组 。

空间复杂度:[NC]95. 数组中的最长连续子序列 - 图6 ,该方法使用常数空间 。

我的代码

  1. public class Solution {
  2. public int MLS(int[] arr) {
  3. if (arr == null || arr.length == 0)
  4. return 0;
  5. int longest = 1;//记录最长的有序序列
  6. int count = 1;//目前有序序列的长度
  7. //先对数组进行排序
  8. Arrays.sort(arr);
  9. for (int i = 1; i < arr.length; i++) {
  10. //跳过重复的
  11. if (arr[i] == arr[i - 1])
  12. continue;
  13. //比前一个大1,可以构成连续的序列,count++
  14. if ((arr[i] - arr[i - 1]) == 1) {
  15. count++;
  16. } else {
  17. //没有比前一个大1,不可能构成连续的,
  18. //count重置为1
  19. count = 1;
  20. }
  21. //记录最长的序列长度
  22. longest = Math.max(longest, count);
  23. }
  24. return longest;
  25. }
  26. }

解题思路:哈希表

一个数字连续序列是不包含重复的数字的,所以使用 [NC]95. 数组中的最长连续子序列 - 图7 去重。
[NC]95. 数组中的最长连续子序列 - 图8
为了保证[NC]95. 数组中的最长连续子序列 - 图9的时间复杂度,避免重复枚举一段序列,我们要从序列的起始数字向后枚举。也就是说如果有一个[NC]95. 数组中的最长连续子序列 - 图10的连续序列,我们只会以[NC]95. 数组中的最长连续子序列 - 图11为起点向后枚举,而不会从[NC]95. 数组中的最长连续子序列 - 图12向后枚举。
[NC]95. 数组中的最长连续子序列 - 图13
如何保证只会以[NC]95. 数组中的最长连续子序列 - 图14为起点向后枚举?
其实只需要每次在哈希表中检查是否存在[NC]95. 数组中的最长连续子序列 - 图15即可。如果[NC]95. 数组中的最长连续子序列 - 图16存在,说明当前数[NC]95. 数组中的最长连续子序列 - 图17不是连续序列的起始数字,我们跳过这个数。

复杂度分析

时间复杂度: [NC]95. 数组中的最长连续子序列 - 图18 ,其中 [NC]95. 数组中的最长连续子序列 - 图19 为数组的长度,该方法需要遍历一次数组所有元素 。

空间复杂度:[NC]95. 数组中的最长连续子序列 - 图20 ,哈希表存储数组中所有的数需要[NC]95. 数组中的最长连续子序列 - 图21 的空间。

我的代码

  1. class Solution {
  2. public static int longestConsecutive(int[] nums) {
  3. if (nums == null || nums.length == 0) return 0;
  4. HashSet<Integer> set = new HashSet<>();
  5. // HashSet 去重
  6. for (int i = 0; i < nums.length; i++) {
  7. set.add(nums[i]);
  8. }
  9. int res=0;
  10. for (int num : set) {
  11. int count = 0;
  12. if (set.contains(num - 1)) continue;
  13. else{
  14. // 统计起始序列长度
  15. while(set.contains(num++)) count++;
  16. res= Math.max(count,res);
  17. }
  18. }
  19. return res;
  20. }
  21. }