給定一個未排序的整數數組,找出最長連續序列的長度。
要求算法的時間複雜度爲 O(n)。
示例:
輸入: [100, 4, 200, 1, 3, 2]
輸出: 4
解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度爲 4。
題目要求 O(n) 複雜度。
- 用哈希表存儲每個端點值對應連續區間的長度
- 若數已在哈希表中:跳過不做處理
- 若是新數加入:
- 取出其左右相鄰數已有的連續區間長度 left 和 right
- 計算當前數的區間長度爲:
cur_length = left + right + 1
- 根據 cur_length 更新最大長度 max_length 的值
- 更新區間兩端點的長度值
#include <iostream>
#include <vector>
#include <map>
using namespace std;
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
map<int, int> hashmap;
int maxlen = 0;
int len = nums.size();
int curlen;
int i;
int left, right;
for(i = 0; i < len; i++){
if(hashmap[nums[i]] == 0){
left = hashmap[nums[i] - 1];
right = hashmap[nums[i] + 1];
curlen = left + right + 1;
if(curlen > maxlen){
maxlen = curlen;
}
hashmap[nums[i]] = curlen;
hashmap[nums[i] - left] = curlen;
hashmap[nums[i] + right] = curlen;
}
}
return maxlen;
}
};
int main(){
int n[] = {100, 4, 200, 1, 3, 2};
vector<int> nums(n, n + 6);
Solution a;
int re = a.longestConsecutive(nums);
cout << re << endl;
}