Problem:
Given an array of integers and an integer k, find out whether there there are two distinct indices i and j in the array such that nums[i] = nums[j] and the difference between i andj is at most k.
Analysis:
Solutions:
C++:
static bool CompareLess(pair<int, int> left, pair<int, int> right)
{
if((left.first < right.first)
|| (left.first == right.first && left.second < right.second))
return true;
return false;
}
bool containsNearbyDuplicate(vector<int>& nums, int k) {
if(nums.size() < 2 || k < 0)
return false;
vector<pair<int, int> > indexed_elements;
for(int i = 0; i < nums.size(); ++i)
indexed_elements.push_back(make_pair(nums[i], i));
sort(indexed_elements.begin(), indexed_elements.end(), CompareLess);
for(int i = 0; i < indexed_elements.size();) {
if(i == indexed_elements.size() - 1)
break;
if(indexed_elements[i].first == indexed_elements[i + 1].first) {
vector<int> indices(1, indexed_elements[i].second);
int j = i + 1;
cout << indexed_elements.size() << endl;
for(; j < indexed_elements.size() && indexed_elements[j].first == indexed_elements[j - 1].first; ++j)
indices.push_back(indexed_elements[j].second);
i = j;
for(j = 0; j < indices.size() - 1; ++j) {
if(indices[j + 1] - indices[j] <= k)
return true;
}
} else
++i;
}
return false;
}
Java
:
Python: