问题: 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 inO(n)complexity.
方法1
先对数组进行排序,然后遍历数组中的元素查找最长连续序列。
- 使用变量longest进行记录最后结果
- 从当前元素开始check是否连续,记录长度,并与最大长度进行比较
- 如果小于最大长度,跳转到
当前位置+记录长度进行下一轮check - 如果数组长度小于已记录的最大长度即可退出check
不过,排序的时间复杂度已经会达到#card=math&code=O%28nlogn%29&height=20&width=67),所以最终的时间复杂度会超出要求的
#card=math&code=O%28n%29&height=20&width=36)。
*方法2
使用hash表存储所有出现过的元素,对于每一个元素,以该元素为中心向左右两个方向进行扩张,直到不连续为止,记录下最长的长度。
#include <iostream>#include <vector>#include <unordered_set>using namespace std;//时间复杂度O(n),空间复杂度O(n)int longestConsecutive(const vector<int> nums) {unordered_set<int> my_set;for (auto i : nums)my_set.insert(i);int longest = 0;for (auto i : nums) {int length = 1;for (int j = i - 1; my_set.find(j) != my_set.end(); j--) {//针对数组中的一个连续序列,这里一定能完整获取到全部元素//所以,这里直接对hash表中的元素进行删除my_set.erase(j);length++;}for (int j = i + 1; my_set.find(j) != my_set.end(); j++) {my_set.erase(j);length++;}longest = longest >= length ? longest : length;}return longest;}//int main() {// vector<int> nums= {100, 4, 200, 1, 3, 2};// cout<<longestConsecutive(nums) << endl;// return 0;//}
Points
auto:自动变量erase():删除容器中与传入参数hash值相同的元素
