题目大致意思是:
给出一个整型数组 groupSizes ,groupSizes[i] 是第 i 个人所在的组的大小。
这个数组也就是存的每个人所在的组的大小。
要求返回一个列表,包含所有组,使得每个人 (i) 都在对应于 groupSizes[i] 的大小的组里面
每个人应该 恰好只 出现在 一个组 中,并且每个人必须在一个组中。如果有多个答案,返回其中 任何 一个。可以 保证 给定输入 至少有一个 有效的解。
输入:groupSizes = [3,3,3,3,3,1,3]
输出:[[5],[0,1,2],[3,4,6]]
输入:groupSizes = [2,1,3,3,3,2]
输出:[[1],[0,5],[2,3,4]]
class Solution {
public List<List<Integer>> groupThePeople(int[] groupSizes) {
List[] list = new ArrayList[505];
List<List<Integer>> result = new ArrayList<List<Integer>>();
for(int i=0;i<505;i++){
// list[i] 代表 大小为i的组中的人
list[i] = new ArrayList<Integer>();
}
for(int i=0; i<groupSizes.length; i++){
list[groupSizes[i]].add(i); // i 加入大小为 groupSizes[i] 的组
// 如果大小为 groupSizes[i] 的组中人数 已经 达到了组大小,就拆出来,得到了一个组
if(list[groupSizes[i]].size() == groupSizes[i]){
// 注意:这里必须 new 一下进行深拷贝,否则在下面 clear 的时候会连带的把result中也clear了。
result.add(new ArrayList<>(list[groupSizes[i]]));
list[groupSizes[i]].clear();
}
}
return result;
}
}
知识点1:
在定义嵌套ArrayList时,以这种形式创建,new 后面一个ArrayList 一个 List。
List<List<Integer>> result = new ArrayList<List<Integer>>();
知识点2:
在使用嵌套ArrayList时,添加ArrayList对象的时候注意new 一下成深拷贝,否则就是浅拷贝!原ArrayList对象做的操作也会连带的影响自身!
result.add(new ArrayList<>(list[groupSizes[i]]));