有 n 位用户参加活动,他们的 ID 从 0 到 n - 1,每位用户都 恰好 属于某一用户组。给你一个长度为 n 的数组 groupSizes,其中包含每位用户所处的用户组的大小,请你返回用户分组情况(存在的用户组以及每个组中用户的 ID)。
你可以任何顺序返回解决方案,ID 的顺序也不受限制。此外,题目给出的数据保证至少存在一种解决方案。
示例 1:
输入:groupSizes = [3,3,3,3,3,1,3]
输出:[[5],[0,1,2],[3,4,6]]
解释:
其他可能的解决方案有 [[2,1,6],[5],[0,4,3]] 和 [[5],[0,6,2],[4,3,1]]。
示例 2:
输入:groupSizes = [2,1,3,3,3,2]
输出:[[1],[0,5],[2,3,4]]
提示:
groupSizes.length == n
1 <= n <= 500
1 <= groupSizes[i] <= n2
题解看代码!
题解 //其实昨天那道题 思路和我是差不多的 只不过 是没敢踏出那一步
//就是感觉有点麻烦,不过答案还是完美实现了
public List> groupThePeople(int[] groupSizes) {
//其实就是和你想的一样啦,就是用一个二维list,然后数组的一维下标就代表它的组员数
//结合贪心算法,就是每一个数进来,先找一下有没有自己的组织(和自己数目相同)的数组,有的话就添加
//无的话就新创建一个,然后等到数组长度和自己的list的长度一样时,就说明当前的满了,如果有相同的就要重新创建了。
int key=0;
List> lists=new ArrayList<>();
ArrayList[]hashArray=new ArrayList[groupSizes.length+1];
//int []a=new int[];是开辟一个int整型的数组,
// 所以 ArrayList[]hashArray=new ArrayList[n+1];
//就是开辟一个ArrayList的数组,也就是一个二维数组
//为什么要n+1个,怎么说,最多有n个数,而且是从1开始,所以开辟n+1个空间,不管最后有没有用到
for(int i=0;i< groupSizes.length;i++)
{
key=groupSizes[i];
if(hashArray[key] ==null)
{
ArrayList list = new ArrayList<>();
hashArray[key] = list;
//要先建一个 list进去 ,因为本来数组里面就是这个元素
//你必须要 现有这个元素吧,有了这个元素才好在这个元素添加东西。
//二维数组每个元素 都是一个list,而这个list本来是没有的,所以要新建。
}
hashArray[key].add(i);
if(hashArray[key].size()==key)
{
lists.add(new ArrayList(hashArray[key]));//这还是同样的问题,就是原本简单的想法可能是 直接丢一个hashArray[key],但是不行阿,
//这样很容易对原本的hashArray[key]造成影响,因为后面还要对它操作啥的,所以怎么办呢?还是同样道理,创一个新的ArrayList没然后丢一个引用过去!
hashArray[key].clear();
}
}
return lists;
}



