219. 存在重复元素 II
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
示例 1:
输入: nums = [1,2,3,1], k = 3 输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1 输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2 输出: false
这道题意思好像是让用hash来做
解法1:我想的这个方法很蛋疼,1830ms。。。强行ac的
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<=i+k;j++)
{
if(j>=nums.size()) break;
if(nums[i]==nums[j])
return true;
}
}
return false;
}
};
int main(){
int n,m,k;
vector<int> nums;
cin>>n;
for(int i=0;i<n;i++){
cin>>m;
nums.push_back(m);
}
cin>>k;
Solution solution;
cout<<solution.containsNearbyDuplicate(nums,k)<<endl;
system("pause");
}
解法2:hash,以索引作为value,对应的值作为key,然后通过hash去做,需要注意的是如果出现相同的值,但是索引差比k大,就把索引更新。
#include<iostream>
#include<vector>
#include <string>
#include<unordered_map>
using namespace std;
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
if(nums.size()==0 || k<=0) return false;
unordered_map<int ,int> res;
for(int i=0;i<nums.size();i++){
if(res.find(nums[i])==res.end()) //如果找到相同的value,更新key
res[nums[i]]=i;
// res.insert({ nums[i],i}); //在vs中,这样插入会出现问题
else
{
if(i-res[nums[i]]<=k)
return true;
else
res[nums[i]]=i;
}
}
return false;
}
};
int main(){
int n,m,k;
vector<int> nums;
cin>>n;
for(int i=0;i<n;i++){
cin>>m;
nums.push_back(m);
}
cin>>k;
Solution solution;
cout<<solution.containsNearbyDuplicate(nums,k)<<endl;
system("pause");
}