题目
思路
- 使用 存储计数 的方式(可以用计数数组、map。但可能输入负数,因此使用map)
- 每次对目标计数,基于前一个数(cur-1)的计数累加
唯一不好处理的地方在于:输入序列可能不是连续增大的,这就导致cur的计数无法基于前面数的计数值累加。
int longestConsecutive(vector<int>& v) // 3 2 1
{
using namespace std;
map<int,int> mp;
int ret = 0;
//最巧妙的地方在于:用一次for先把数据缓存到map,利用C++ map对key的自动排序特性,可以很好地处理非连续递增输入的问题;
//当然,也可以先排序,然后遍历,map边插入边累计数
for(const auto& cur:v)
{
mp[cur] = 1;
}
for(auto pr:mp)
{
auto k = pr.first;
mp[k] = mp[k-1] + 1;
ret = max(ret,mp[k]);
}
return ret;
}