QUESTION:
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
EXPLANATION:
这道题目不愧是medium的题目, 确实比easy的题目难度大了一点.
这道题目的思路:
- 首先创建一个数组, 这个数组用来存放该size的对应的人的编号.
- 遍历整个groupsize, 将对应的index放入到前面创建的集合中, groupsize[index] 就是对应的位置.
- 当当前位置的集合满足了index的话,那么就说明已经存满了. 就可以放入到result中.
SOLUTION:
class Solution {
fun groupThePeople(groupSizes: IntArray): List<List<Int>> {
var array : Array<ArrayList<Int>> = Array(groupSizes.size+1) {i -> ArrayList<Int>() }
var result : ArrayList<List<Int>> = ArrayList()
//
for (index in groupSizes.indices) array[groupSizes[index]].add(index)
for (index in array.indices) {
var sum = 0
var arraylist:ArrayList<Int> = ArrayList()
for (i in 0 until array[index].size) {
if (sum < index) {
arraylist.add(array[index].get(i))
}
sum ++
if (sum == index) {
result.add(arraylist)
arraylist = ArrayList()
sum = 0
}
}
}
return result
}
}