Description

There are n people that are split into some unknown number of groups. Each person is labeled with a unique ID from 0 to n - 1.

You are given an integer array groupSizes, where groupSizes[i] is the size of the group that person i is in. For example, if groupSizes[1] = 3, then person 1 must be in a group of size 3.

Return a list of groups such that each person i is in a group of size groupSizes[i].

Each person should appear in exactly one group, and every person must be in a group. If there are multiple answers, return any of them. It is guaranteed that there will be at least one valid solution for the given input.

Example 1:

Input: groupSizes = [3,3,3,3,3,1,3]
Output: [[5],[0,1,2],[3,4,6]]
Explanation:
The first group is [5]. The size is 1, and groupSizes[5] = 1.
The second group is [0,1,2]. The size is 3, and groupSizes[0] = groupSizes[1] = groupSizes[2] = 3.
The third group is [3,4,6]. The size is 3, and groupSizes[3] = groupSizes[4] = groupSizes[6] = 3.
Other possible solutions are [[2,1,6],[5],[0,4,3]] and [[5],[0,6,2],[4,3,1]].

Example 2:

Input: groupSizes = [2,1,3,3,3,2]
Output: [[1],[0,5],[2,3,4]]

Constraints:

  • groupSizes.length == n
  • 1 <= n <= 500
  • 1 <= groupSizes[i] <= n

分析

题目的意思是:现在n个人分成若干组,每个人用唯一的ID来标识,groupSize表示的是对每个人分组的限制,比如groupSizes[1]=3表示第一个人必须存在大小为3的组,现在返回每个person所在的组,返回一种答案即可。

  • 我参考了一下答案,可以用字典解决,字典中的键值对为 (gsize, users),其中 gsize 表示用户组的大小,users 表示满足用户组大小为 gsize。所有用户组大小相同的用户都暂时放在了同一个组中。
  • 然后将字典中的每个键值对 (gsize, users) 中的 users 进行细分组,添加到结果集合res中。

代码

class Solution:
def groupThePeople(self, groupSizes: List[int]) -> List[List[int]]:
d=collections.defaultdict(list)
for i,_id in enumerate(groupSizes):
d[_id].append(i)
res=[]
for gSize,users in d.items():
for i in range(0,len(users),gSize):
res.append(users[i:i+gSize])
return res

参考文献

​用户分组​