1. 程式人生 > >leetcode219:存在重複元素Ⅱ

leetcode219:存在重複元素Ⅱ

思想:

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

大佬的思想,學習學習