问题描述:
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 j is at most k.
思路:
一开始直接思路是对每一个数都进行往下k次比较,这样复杂度就是O(nk)。当k过大的时候,就出现了Time Limit Exceeded。
然后很自然地想到用过一个字典来记录出现的数字和其最新下标,键值对是<数字,下标>,所以用一个map来存放,找到相同key就检查下标的距离。
代码:
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
int length = nums.size();
map<int, int> record_index;
int i; //i is a circulation index as well as a guard
for (i = 0; i < length; i++)
{
int val = nums[i];
map<int, int>::iterator val_it = record_index.find(val);
if (val_it != record_index.end())
{
if (i - val_it->second <= k) break;
val_it->second = i; //update the index
}
else record_index.insert(pair<int, int>(val, i));
}
if (i == length) return false; //can not break until finishing the nums array
else return true;
}
};