題目描述
給定一個整數數組和一個整數 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
題解1
剛開始看錯題目,將“最大”二字漏掉了。然後用暴力方法判斷下標之差在k範圍內的兩數是否相等,超時!!
代碼1
/*
暴力方法,時間複雜度爲O(n^2)
*/
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
int len = nums.size();//長度
bool flag = false;
for(int i = 0; i < len; ++i){
if(!flag){
for(int j = i + 1; j <= i + k && j < len; ++j){
if(nums[i] == nums[j]){
flag = true;
break;
}
}
}
}
return flag;
}
};
題解2
因爲判斷兩個數是否相等,存在查找。如果利用set和map這些數據結構,速度肯定快很多。
具體思路爲:建立一個map,key爲元素值,value爲下標。遍歷nums數組,判斷元素是否在map中存在,不存在,加入。存在,判斷下標之差是否不大於k,大於,則更新當前元素的value爲較大的下標,否則,則找到符合條件的兩個元素,返回true。
·
代碼2
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
int len = nums.size();//長度
bool flag = false;
map<int, int>myMap;
for(int i = 0; i < len; ++i){
if(myMap.find(nums[i]) ==myMap.end()){//不存在
myMap[nums[i]] = i;
}
else{
int j = myMap[nums[i]];
if(i - j <= k){//符合條件
flag = true;
break;
}
else{//不符合,更新下標爲較大值
myMap[nums[i]] = i;
}
}
}
return flag;
}
};