leedcode219. 存在重复元素 II
题目描述
解题过程
1.拿到题目首先考虑了双指针遍历,时间复杂度O(n2) 超时
2.官方解答哈希表思路:
创建一个哈希表(map与unordered_map的区别)
遍历数组nums,如果在哈希表中找到了nums[i],并且此时的i和哈希表中的差值小于k,就return true。
核心代码
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int,int> st;
int n=nums.size();
int num=0;
for(int i=0;i<n;i++){
num=nums[i];
if(st.count(num)&&i-st[num]<=k){
return true;
}
st[num]=i;
}
return false;
}
};
函数积累,count VS find
在哈希表中找某个数
st.count(num);
如果找到了则是1,没找到是0;
对比find
find(num)找的是下标,没找着的话返回的是st.end().
代码反思
第一遍做的时候想用双指针,但是写的时候才意识到可能要超时
审题,小于等于k,应该考虑滑动窗口
map 与unordered_map
关键词记忆:有序和无序
由于底层实现方式不同 ,map是红黑树,unordered_map是哈希桶
所以 map是有序,更适用于,按序输出,或者是找最大最小(有序遍历之类的咱就是性能好)
哈希表更适用于 快速查找键值对,计算某个出现了几次(咱就是快)
因为map在插入和删除是 需要维持红黑树的平衡
空间利用率:map比unordered_map好
迭代器:map按红黑树中序遍历进行操作 双向++/-- unordered_map按逐个桶往后遍历 单向++(后续继续学习)
ACM模式完整代码
#include <iostream>
#include<string>
#include<vector>
#include <unordered_map>
using namespace std;
int main()
{
vector<int> nums;
int k;
int num;
while (cin >> num) {
nums.push_back(num);
if (cin.get() == '\n')
break;
}
cin >> k;
unordered_map<int,int> st;
int n = nums.size();
for (int i = 0; i < n; i++) {
num = nums[i];
if (st.count(num) && i - st[num] <= k) {
cout<<"true";
}
st[num] = i;
}
cout<<"false";
}