leetcode219:存在重複元素Ⅱ
阿新 • • 發佈:2018-11-02
思想:
1.先判斷nums是否為空,為空則返回false。再判斷k是否等於0,為0則返回false。
2.由於range函式後面的範圍取不到則需要k+1,然後需要判斷加1後的k有什麼超過nums的長度。若超過,則選擇nums的長度作為k值。
3.定義了一個雙向佇列windows來儲存元素的下標,一個集合d來儲存元素。
4.先從下標0開始取元素並判斷是否已經存在d中,由於我們的下標範圍是0-k+1,若存在d中,則說明有滿足條件的i和j。若不存在則將該元素加入d,依次迴圈直到結束。
5.若此次迴圈並沒有找到,則開始第二個迴圈。由於要滿足i和j的絕對值最大為k,每次迴圈前我們需要刪除d中一個元素,我們可以根據windows所存下標依次刪。然後在判斷之後的元素是否在d中,若存在d中,則說明有滿足條件的i和j。若不存在則將該元素加入d,依次迴圈直到結束。
from collections import deque class Solution: def containsNearbyDuplicate(self, nums, k): """ :type nums: List[int] :type k: int :rtype: bool """ if not nums: return False if k == 0: return False k = k + 1 k = min(k, len(nums)) window = deque([]) d = set() for i in range(0, k): if nums[i] in d: return True d |= {nums[i]} window.append(i) for i in range(k, len(nums)): d -= {nums[window.popleft()]} if nums[i] in d: return True d |= {nums[i]} window.append(i) return False
大佬的思想,學習學習