219. 存在重複元素 II - 力扣(LeetCode)

題目描述

給定一個整數數組和一個整數 k,判斷數組中是否存在兩個不同的索引 i 和 j,使得 nums [i] = nums [j],並且 ij 的差的絕對值最大爲 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;
    }
};

執行結果2

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章