题目:找出数组中连续的数的最长长度。
思路:将数组中的数全部添加到Hash表中,再在Hash表中上下查找,找出最长的连续长度。
工具:在网上看到大神都是用unordered_set容器进行处理,于是学习了一下unordered_set,和unordered_map作用基本相同,原理如图1(转载链接)
unordered_set是一种无序集合,既然跟底层实现基于hashtable那么它一定拥有快速的查找和删除,添加的优点.
基于hashtable当然就失去了基于rb_tree的自动排序功能。(转载链接)
代码:
#include <iostream>
#include<algorithm>
#include <vector>
#include <cmath>
#include <unordered_set>
using namespace std;
int main(int argc, const char * argv[]) {
vector<int> nums{1, 0, -1};
unordered_set<int> set(nums.begin(),nums.end()); //将数组中的数添加到Set表中,也可使用inset()函数单个添加
int maxlength=0;
while(!set.empty()) //循环遍历set表
{
int length=1; //自身已经算一个
int temp= *set.begin();
set.erase(temp); //删除自身,防止其他数再对自身进行遍历
for(int i=temp+1;set.find(i)!=set.end();++i)
//遍历自身后面相邻的数,若存在,则长度+1;若不存在,则find()函数将返回end();
{
set.erase(i); //遍历后,删除自身,理由同上
length++;
}
for(int j=temp-1;set.find(j)!=set.end();--j)//遍历自身前面相邻的数
{
set.erase(j);
length++;
}
maxlength=max(maxlength,length); //当前数的最大的相邻长度
}
return maxlength;
}