Given an integer array nums and an integer k, return true if there are two distinct indices i and j in the array such that nums[i] == nums[j] and abs(i – j) <= k.
給予一個整數陣列 nums,和一個整數 k,如果有兩個重複值得索引 i 和 j 在這個陣列中,且符合以下條件,則回傳 true。 1. nums[i] == nums[j] 2. abs(i – j) <= 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
Solution:
1. 判斷是否有重複的數字,沒有直接返回 false。
2. 宣告 box 物件{}。
3. 依序將 nums 放入 box{}。
4. 加入判斷式,且同時符合,則回傳 true:
1. 物件特性找出有出現過的數值。 2. 重複出現的數值索引 i 和 j,兩者之間的距離小於等於 k。
5. 將 box[] 數值放入對應的索引。
6. 皆不符合,回傳 false。
Code 1: BigO(n)
var containsNearbyDuplicate = function(nums, k) { if (nums.length <= 1) return false //只有一個數值,條件不成立,故提前結束。 let box = {} for (let i in nums) { let j = nums[i] if (box[j] && ((i - box[j]) <= k)) { return true } box[j] = i } return false };
FlowChart:
Example 1
Input: nums = [1,2,3,1], k = 3 nums.length = 4 >= 1 step.1 box = {} i = 0, j = 1, box[1] = undefined => false |box[1] = 0 => {'1': 0} i = 1, j = 2, box[2] = undefined => false |box[2] = 1 => {'1': 0, '2': 1} i = 2, j = 3, box[3] = underfined => false |box[3] = 2 => {'1': 0, '2': 1, '3': 2} i = 3, j = 1, box[1] && ((3 - box[1]) <= k) // 0 && ((3 - 1) <= 3) => return true
Example 2
Input: nums = [1,0,1,1], k = 1 nums.length = 4 >= 1 step.1 box = {} i = 0, j = 1, box[1] = undefined => false |box[1] = 0 => {'1': 0} i = 1, j = 0, box[0] = undefined => false |box[0] = 1 => {'0': 1, '1': 0} i = 2, j = 1, box[1] = 0 && ((2 - box[1]) <= k) => false |box[1] = 2 => {'0': 1, '1': 2} i = 3, j = 1, box[1] = 2 && ((3 - box[1]) <= k) => true
Example 3
Input: nums = [1,2,3,1,2,3], k = 2 nums.length = 6 >= 1 step.1 box = {} i = 0, j = 1, box[1] = undefined => false |box[1] = 0 => {'1': 0} i = 1, j = 2, box[2] = undefined => false |box[2] = 1 => {'1': 0, '2': 1} i = 2, j = 3, box[3] = undefined => false |box[3] = 2 => {'1': 0, '2': 1, '3': 2} i = 3, j = 1, box[1] = 0 && ((3 - box[1]) <= k) => false |box[1] = 3 => {'1': 3, '2': 1, '3': 2} i = 4, j = 2, box[2] = 1 && ((4 - box[2]) <= k) => false |box[2] = 4 => {'1': 3, '2': 4, '3': 2} i = 5, j = 3, box[3] = 2 && ((5 - box[3]) <= k) => false |box[3] = 5 => {'1': 3, '2': 4, '3': 5} return false
Code 2: BigO(n)
var containsNearbyDuplicate = function (nums, k) { if (nums.length <= 1) return false; const hashTable = {} for (let i = 0; i < nums.length; i++) { if (hashTable[nums[i]] !== undefined && (i - hashTable[nums[i]] <= k)) return true; hashTable[nums[i]] = i } return false; };
Code 3: Sliding Window BigO(n)
var containsNearbyDuplicate = function(nums, k) { const set = new Set() for (let i = 0; i < nums.length; i++) { if (set.has(nums[i])) return true; set.add(nums[i]) if (set.size > k) { set.delete(nums[i - k]) } } return false; };