题目描述:
题号:128
题目描述:
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
边界条件:
-
0 <= nums.length <= 105
-
-109 <= nums[i] <= 109
示例 :
输入:nums = [100,4,200,1,3,2] 输出:4 解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
解题思路:
思路一:利用哈希表,每个数都判断一下是不是连续序列的开头
用哈希表查找这个数前面一个数是否存在,即num-1在序列中是否存在。存在那这个数肯定不是开头,直接跳过。
因此只需要对每个开头的数进行循环,直到这个序列不再连续。因此时间复杂度是O(N),空间复杂度是哈希表所占空间O(N)。对数字哈希表也起到了去重的作用。
时间复杂度:O(N)
空间复杂度:O(N)
C++
// C++
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.size() == 0) {
return 0;
}
unordered_set<int> uniqueNum;
for(const int& num : nums) {
uniqueNum.insert(num);
}
int longestArr = 0;
for(const int& num : uniqueNum) {
if(uniqueNum.count(num - 1) == 0) {
int curNum = num;
int curArr = 1;
while(uniqueNum.count(curNum + 1)) {
curNum += 1;
curArr += 1;
}
longestArr = max(longestArr, curArr);
}
}
return longestArr;
}
};
go
// go
func longestConsecutive(nums []int) int {
if len(nums) == 0 {
return 0;
}
uniqueNum := map[int]bool{}
for _, num := range nums {
uniqueNum[num] = true
}
longestArr := 0
for num := range uniqueNum {
if uniqueNum[num - 1] == false {
curNum := num
curArr := 1
for uniqueNum[curNum + 1] == true {
curArr++
curNum++
}
if longestArr < curArr {
longestArr = curArr
}
}
}
return longestArr
}