1 import collections 2 class Solution: 3 def isPossibleDivide(self, nums: 'List[int]', k: int) -> bool: 4 n = len(nums) 5 if n % k != 0:#必须是整倍数 6 return False 7 dic = collections.OrderedDict()#有序字典 8 nums = sorted(nums)#有序数组 9 keylist = [] 10 for i in range(n): 11 if nums[i] not in dic: 12 dic[nums[i]] = 1 13 keylist.append(nums[i])#只保存key值,并且有序 14 else: 15 dic[nums[i]] += 1 16 gc = n // k#一共gc组 17 while gc > 0: 18 gc -= 1 19 firstkey = keylist[0] 20 if dic[firstkey] > 1: 21 dic[firstkey] -= 1 22 else: 23 dic.pop(firstkey) 24 keylist.remove(firstkey) 25 nextkey = firstkey 26 for t in range(1,k): 27 nextkey += 1 28 if nextkey in dic: 29 if dic[nextkey] > 1: 30 dic[nextkey] -= 1 31 else: 32 dic.pop(nextkey) 33 keylist.remove(nextkey) 34 else: 35 return False 36 return True
算法思路:贪心。
先将数组排序,然后按照顺序添加到顺序字典中。
另记录一个key值从小到大的列表。
每次从key列表中选择最小的元素,作为组头,当前组的剩余k-1个元素,依次+1。如果不满足这个条件,则返回False。
如果全部的元素都能分配到对应的组中,就表示符合题意。