LeetCode - 128. Longest Consecutive Sequence - 思路详解- C++
2017-01-16 22:23
447 查看
题目
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.
翻译
假设有一个未排序整数数组,找出数组中最长的连续序列。比如:数组【100,4,200,1,3,2】
最长的连续序列为【1,2,3,4】。则返回其长度为4
思路
我们使用map来求解。首先将所有的数字映射到map<\int,bool>即表示该数存在
然后遍历数组,对每一个数组num[i],
每次加一,只要其存在且连续,同时计数加1。同时删除map中该元素。
每次减一,只要其存在且联系,同时计数加1。然后删除map中元素。
然后比较更新max。
分析:
将所有元素映射到map中时间复杂度为O(nlog);
然后判断是存在,时间复杂度为O(n)
删除元素,时间复杂度为O(nlogn)
所以整体时间时间复杂读为O(nlogn)
代码
class Solution { public: int longestConsecutive(vector<int>& nums) { map<int,bool> nums_map; for(int i = 0; i < nums.size(); i++){ nums_map[nums[i]] = true; } int max = 0; for(int i = 0; i < nums.size(); i++){ if(nums_map.count(nums[i]) != 0){ int down = nums[i]-1; int up = nums[i]+1; int cnt = 1; nums_map.erase(nums[i]); //清除 while(nums_map.count(down) != 0){ //cout << "down " << down << endl; cnt++; nums_map.erase(down); down--; } while(nums_map.count(up) != 0){ //cout << "up " << up << endl; cnt++; nums_map.erase(up); up++; } //cout << cnt << endl; if(cnt > max){ max = cnt; } } } return max; } };
相关文章推荐
- 用二进制位运算 来判断一个数是奇数还是偶数
- 定时关机 MFC应用(C语言)
- boolan——c++学习笔记1
- STM32学习笔记:基础例子
- PAT乙级1062
- C语言,函数部分
- Geekband c++ 第二周(侯捷主讲)
- 一维码Codabar简介及其解码实现(zxing-cpp)
- 一维码Codabar简介及其解码实现(zxing-cpp)
- C++04_类中不写成员函数易犯错误模型
- 堆内存和栈内存详解
- C++与C#的区别
- C++中的箭头
- PAT乙级1060
- 表达式求值--栈(c++/java实现)
- 二维码QR Code简介及其解码实现(zxing-cpp)
- 二维码QR Code简介及其解码实现(zxing-cpp)
- 蓝桥杯 C语言 基础训练 数列排序
- TSP_旅行商问题 - 蛮力法DFS(一)
- TSP_旅行商问题 - 蛮力法DFS(一)