题目描述
解题思路
哈希表
注意:请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
所以排序不行,排序时间复杂度O(nlogn)。
官解:
本题的是要找出连续的子序列,所以我们可以把所有数字添加到hash表中,遍历数组nums[i],如果hash表中没有nums[i] - 1,那么表示它前边不连续,所以我们可以使用这个数字再hash表中查找他的递增序列,nums[i] + 1,nums[i]+2…,直到找到hash表中没有为止,此时使用计数器记录子序列长度。
// 哈希表public int longestConsecutive(int[] nums) {Set<Integer> set = new HashSet<>();for (int i = 0; i < nums.length; i++) {set.add(nums[i]);}int longestStreak = 0;for (int num : nums) {// 当不存在num-1的数字,此时就可以递增寻找if (!set.contains(num - 1)) {int currentNum = num;int currentStreak = 1;// 一直循环递增,记录自增子序列的长度while (set.contains(currentNum + 1)) {currentNum += 1;currentStreak += 1;}// 取最大的序列长度longestStreak = Math.max(currentStreak, longestStreak);}}return longestStreak;}

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