iT邦幫忙

0

leetcode with python:219. Contains Duplicate II

  • 分享至 

  • xImage
  •  

題目:

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.

給定一個陣列跟一數k,確認此陣列是否有重複的數且兩者在陣列中的距離小於等於k

這題我決定用sliding window去做
順便複習這個好久不見的演算法

class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        s=set()
        i=0
        j=0
        while j<len(nums):
            if j-i<=k:
                if nums[j] not in s:
                    s.add(nums[j])
                    j=j+1
                else:
                    return True
            else:
                s.remove(nums[i])
                i=i+1
        return False

在一開始的位置,設立兩個指標
一個先往前走,將路過的值放入set,一旦兩指標相距超過k,另一個指標便要往前移,並將其原本位置的值從set移除
過程持續直到陣列末端,途中一旦發現要放入的值存在在set內,就回傳True
若到最後還是沒發現,就回傳False
最後執行時間645ms(faster than 91.42%)

當然也有hash map解
我這裡分享一個在討論區看到的解法

class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        d={}
        for i in range(len(nums)):
            if nums[i] in d and i-d[nums[i]]<=k:
                return True
            d[nums[i]]=i
        return False

建立一個dictionary(d),紀錄值及他們的位置
若遇到值的位置-dictionary紀錄的位置<=k
那麼就回傳True
如果相差超過k,就刷新d所紀錄該值的位置(紀錄的值是要離遍歷中的指標最近的)
到最後都沒發現就回傳False
最後執行時間601ms(faster than 98.99%)

那我們下題見


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言