来看一个题:
我们初看这个问题,相信每个人都能很快写出来,但是接下来我们看到的代码,思路一样但是时间复杂度上却有很大不同。
我们思路无非就是哈希的思想,将这个数组中的值放入哈希表中建立起来映射关系,通过映射关系来找到最终我们想要的结果。
unordered_map<int,int> m;
for(size_t i = 0;i < nums.size();++i)
{
m[nums[i]]++;
}
for(auto &it : m)
{
if(it.second > 1)
{
return it.first;
}
}
这样做需要遍历一边数组,而且还要遍历哈希表
但是我们来看下面这种做法
unordered_map<int, bool> map;
for(int num : nums)
{
if(map[num]) return num;
map[num] = true;
}
return -1;
这个代码就极大简化了遍历次数,最多只需要一次遍历数组就行,因此,刷题我们需要锻炼的是思维上的提升,不仅仅是做出来这个题,最关键的是将这个问题能够优化到最优解,这才是我们的功底。