题目:
Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the difference between i and jis at most k.
题意:
给定一个整数数组nums与一个整数k,当且仅当存在两个不同的下标i和j满足nums[i] = nums[j]并且| i - j | <= k时返回true,否则返回false。
解题思路:
定义一个set(set中不存在重复元素),将下标小于k的加入到set集合中,当下标超过k时,移除最开始的元素。当set中的元素个数小于等于k个且插入新元素返回false时,返回true,否则false;
代码:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = m-1;
int j = n-1;
int k = m+n-1;
while(i>-1 && j>-1){
nums1[k--] = (nums1[i] > nums2[j]) ? nums1[i--] : nums2[j--];
}
while(j>-1){
nums1[k--] = nums2[j--];
}
}
};
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int, int> mapping;
for(int i=0; i<nums.size(); i++){
if(mapping.find(nums[i])!=mapping.end() && i-mapping[nums[i]]<=k)
return true;
mapping[nums[i]] = i;
}
return false;
}
};
public class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Set<Integer> result = new HashSet<Integer>();
for(int i = 0; i < nums.length; i++){
if(i > k)
result.remove(nums[i-k-1]);
if(!result.add(nums[i]))
return true;
}
return false;
}
}
public class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
//0842
Set<Integer> appearedNum = new HashSet<Integer>();
int start = 0, end = 0;
for(int i = 0; i < nums.length; i++){
if(!appearedNum.contains(nums[i])){
appearedNum.add(nums[i]);
end++;
} else return true;
if(end - start > k) {
appearedNum.remove(nums[start]);
start++;
}
}
return false;
//0848
}
}