劃分數組爲連續數字的集合

給你一個整數數組 nums 和一個正整數 k,請你判斷是否可以把這個數組劃分成一些由 k 個連續數字組成的集合。
如果可以,請返回 True;否則,返回 False。

現在做了幾十到貪心算法之後,發現貪心策略並不難找,而是用什麼樣數據結構,以及怎樣用數據實現貪心邏輯,所以以後貪心算法我分爲三部分講解

貪心策略:講解本題解題思路
數據結構:介紹本題會用到幾組數據,分別什麼類型,普遍作用。
代碼:幾組數據如何,相互協作,完成邏輯

貪心策略:

  1. 以112233 k=3爲例,發現開始的最小值i總是和,i+1~i+k-1有一定的數量關係,i+1 ~i+k-1的數量必定要大於等於i的數量
  2. 所以我們總是,從小到大排列,檢查i+1~i+k-1的剩餘數量是否大於i的剩餘數量,如果否,則必定不成立

數據結構:

  1. 一個Counter:生成初始每個及對應數字數量和修改剩餘量
  2. 一個列表:有小到大(無重複)數字

代碼:

class Solution:
    def isPossibleDivide(self, nums: List[int], k: int) -> bool:
    #生成初始每個及對應數字數量和修改剩餘量
        s = collections.Counter(nums)
        #有小到大(無重複)數字
        ordered_nums = sorted(s)
        #檢查,修改剩餘量
        for num in ordered_nums:
            occ = s[num]
            if s[num] > 0:
                for i in range(num + 1, num + k):
                    if s[i] >= occ:
                        s[i] -= occ
                    else:
                        return False
        return True
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章