Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
For example,
Given
[100, 4, 200, 1, 3, 2]
,The longest consecutive elements sequence is
[1, 2, 3, 4]
. Return its length:4
.Your algorithm should run in O(n) complexity.
参考:https://oj.leetcode.com/discuss/18886/my-really-simple-java-o-n-solution-accepted
思路如下:用一个map存储所有连续序列的长度,并保存在以序列头尾元素对应的value中。举例来说,对于序列{1,2,3,4,5},map[1]和map[5]应该都等于5。
过程:遍历整个输入数组,对于每一个新元素n:
1. 当前元素如果已经存在在map中,那么直接跳过该元素。
2. 如果n-1和n+1存在在map中,那么说明邻近n有已经存在的序列。变量left和right分别存储两边序列的长度,而0则表示没有已经存在的序列,那么n将是序列的边界。
3. 利用left和right来定位左侧和右侧边界,更新边界和当前n的value均为sum = left + 1 + right。
C++代码实现如下:
int longestConsecutive(vector<int> &num) {
unordered_map<int, int> myMap;
int res = 0;
for (auto n : num) {
if (myMap.find(n) == myMap.end()) {
int left = myMap.find(n - 1) == myMap.end() ? 0 : myMap[n - 1];
int right = myMap.find(n + 1) == myMap.end() ? 0 : myMap[n + 1];
int sum = left + 1 + right;
if (sum > res) res = sum;
myMap[n] = myMap[n - left ] = myMap[n + right] = sum;
}
}
return res;
}
时间性能表现如下:
时间: 2024-10-09 23:37:53