题目描述
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
解题思路
方法一:重新构造二维vector对象,将索引号也保存进去,进而对其排序,再从头遍历,当该元素和下一个元素相同时,计算索引的差值是否小于k。
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
if(nums.size()<=1) return false;
vector<vector<int> > tmp(nums.size(),vector<int>(2));
for(int i = 0; i < nums.size(); ++i){
tmp[i][0] = nums[i];
tmp[i][1] = i;
}
sort(tmp.begin(),tmp.end(),cmp);
for(int i = 0; i < nums.size()-1; ++i){
if(tmp[i][0] == tmp[i+1][0]){
if(abs(tmp[i][1] - tmp[i+1][1])<=k) return true;
}
}
return false;
}
static bool cmp(vector<int>& tmp1, vector<int>& tmp2){
if(tmp1[0]<tmp2[0]) return true;
else return false;
}
};
方法二:参考了官方题解,利用set的去重和限制元素个数确定存在的重复元素的性质。
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
set<int> tmp;
for(int i = 0; i < nums.size(); ++i){
if(tmp.count(nums[i])) return true;
tmp.insert(nums[i]);
if(tmp.size() > k) tmp.erase(nums[i-k]);
}
return false;
}
};