給你一個整數數組 nums 和一個正整數 k,請你判斷是否可以把這個數組劃分成一些由 k 個連續數字組成的集合。
如果可以,請返回 True;否則,返回 False。
現在做了幾十到貪心算法之後,發現貪心策略並不難找,而是用什麼樣數據結構,以及怎樣用數據實現貪心邏輯,所以以後貪心算法我分爲三部分講解
貪心策略:講解本題解題思路
數據結構:介紹本題會用到幾組數據,分別什麼類型,普遍作用。
代碼:幾組數據如何,相互協作,完成邏輯
貪心策略:
- 以112233 k=3爲例,發現開始的最小值i總是和,i+1~i+k-1有一定的數量關係,i+1 ~i+k-1的數量必定要大於等於i的數量
- 所以我們總是,從小到大排列,檢查i+1~i+k-1的剩餘數量是否大於i的剩餘數量,如果否,則必定不成立
數據結構:
- 一個Counter:生成初始每個及對應數字數量和修改剩餘量
- 一個列表:有小到大(無重複)數字
代碼:
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