[LeetCode刷題筆記] 219 – Contains Duplicate II

題目描述:

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 absolute difference between i and j is at most k.

Example 1:

Input: nums = [1,2,3,1], k = 3
Output: true

Example 2:

Input: nums = [1,0,1,1], k = 1
Output: true

Example 3:

Input: nums = [1,2,3,1,2,3], k = 2
Output: false

一刷題解(Dictionary):

        這題Contains Duplicate 與 基礎的Contains Duplicate不一樣,它除了要我們找出數組裡是否有重複元素以外,還添加了「重複元素之間的下標距離需要小於等於k」限制。

        基於這個限制,我們可以創建一個鍵為元素、值為其所在下標的字典。我們檢查每個元素是否存在於字典裡面,如果不存在,那就直接更新字典中當前元素的下標值;如果存在,那就檢查當前遍歷到的下標值與字典中紀錄的下標值之間的差是否小於限制;如果大於限制,那就更新字典中當前元素的下標值為現在的下標值,因為上一個下標已經不可以用了(上一個下標到當前下標>k,上一個下標到下一個元素的下標也一定>k,因此我們只能把希望放在當前的下標與下一個重複元素的下標之間的距離上)。

public class Solution {
   public bool ContainsNearbyDuplicate(int[] nums, int k) {
       if(k == 0) { return false; }

//Key: nums[i]; Value: i
       Dictionary<int, int> idxDict = new Dictionary<int, int>();

       for (int i = 0; i < nums.Length; i++)
      {
//首先檢查元素是否重複
           if(idxDict.ContainsKey(nums[i]))
          {
//計算當前下標與上一個下標之間的差是否小於等於k
               if(i - idxDict[nums[i]] <= k)
              {
                   return true;
              }
          }
//更新字典中記錄的元素下標
           idxDict[nums[i]] = i;
      }

       return false;        
  }
}