题目描述

image.png

解题思路

哈希表

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

所以排序不行,排序时间复杂度O(nlogn)。
官解:
image.png
本题的是要找出连续的子序列,所以我们可以把所有数字添加到hash表中,遍历数组nums[i],如果hash表中没有nums[i] - 1,那么表示它前边不连续,所以我们可以使用这个数字再hash表中查找他的递增序列,nums[i] + 1,nums[i]+2…,直到找到hash表中没有为止,此时使用计数器记录子序列长度。

  1. // 哈希表
  2. public int longestConsecutive(int[] nums) {
  3. Set<Integer> set = new HashSet<>();
  4. for (int i = 0; i < nums.length; i++) {
  5. set.add(nums[i]);
  6. }
  7. int longestStreak = 0;
  8. for (int num : nums) {
  9. // 当不存在num-1的数字,此时就可以递增寻找
  10. if (!set.contains(num - 1)) {
  11. int currentNum = num;
  12. int currentStreak = 1;
  13. // 一直循环递增,记录自增子序列的长度
  14. while (set.contains(currentNum + 1)) {
  15. currentNum += 1;
  16. currentStreak += 1;
  17. }
  18. // 取最大的序列长度
  19. longestStreak = Math.max(currentStreak, longestStreak);
  20. }
  21. }
  22. return longestStreak;
  23. }

image.png
由于是找到了没有nums[i]-1,才进入内层循环。
例如:100,4,200,1,3,2
只有100,200,1才会进入内层继续查找递增序列。4,3,2都能找到比他小1的数,所以不查找,而是加入hash表。