LeetCode 219. Contains Duplicate II-python(easy)

題目來源:

      https://leetcode.com/problems/contains-duplicate-ii/description/

題目分析:

  本題是要給定一個整數數組和整數k,找出數組中是否存在兩個不同的索引i和j,使得NUMS[i]=NUMS[j]並且i和j之間的絕對差值至多k。

  最簡單的想法是採用循環二重檢索,但是時間複雜度太高不能通過,將代碼寫在下方:

class Solution:
    def containsNearbyDuplicate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        for i in range(len(nums)-1):
            for j in range(i+1,len(nums)):
                if(nums[i]==nums[j] and (j-i)<=k):
                    return True
        return False

   第二種思路類似於Hashmap思想(也可能就是),就是利用python中的字典結構。遍歷所有元素,將元素值當做鍵、元素下標當做值,存放在一個字典中。遍歷的時候,如果發現重複元素,則比較其下標的差值是否小於k,如果小於則可直接返回True,否則更新字典中該鍵的值爲新的下標。

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

  第三種思想是利用Hashset思想(不知道是不是),就是利用窗口的想法來實現。在python中應用到set(集合)的類型,它是一個無序不重複的元素集。對於集合蘊含的方法,可以詳見https://www.cnblogs.com/lemonbit/p/6239156.html。則本題的思想是在遍歷列表的時候維護一個集合,集合中保存當前元素前面的k個元素,每次訪問一個元素時判斷是否在該集合中出現過。

class Solution(object):
    def containsNearbyDuplicate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        window = set([])
        for i in range(len(nums)):
            if i > k:
                window.discard(nums[i-k-1])
            if nums[i] in window:
                return True
            else:
                window.add(nums[i])
        return False
set.remove(obj)和set.discard(obj)的區別在於,當obj存在於set中時,都將其刪除;但當obj不存在於set中時,remove()會報錯,discard()不會。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章