本次刷题日记的第 90 篇,力扣题为:1282. 用户分组
一、题目描述:
咱今天不买彩票了,被套牢了,我们来给用户分一下组
二、这道题考察了什么思想?你的思路是什么?
题目的要求相对明确,就是需要我们给用户按照规则来进行分组,但是分组的规则咱们需要仔细瞅瞅
- 本题给出的 groupSizes 数组,数组的索引表示人的编号,数组的值表示人所属组的大小
- 这里需要注意,1 个人只能出现在 1个组中
- 题目要求我们按照组的大小和人的编号进行划分和分组
分析
其实在看这个题的时候,有点晕,不知道题目是要我们做些啥,但是仔细去查看题目的用意以及题目给出数组表示的含义之后,其实题目处理起来还是比较简单的
简单来说,第一,我们需要知道某一个 size 的组,他会对应多少人,第二,我们需要根据这个对应关系来进行拆分组就可以了
例如
开发组对应的有 6 个编号对应的人
a | b | c | d | e | f |
但是他们对应的组需要拆分成 size 为 3 的组
那么就会有这种情况的拆分
开发组1 | a | b | c |
开发组2 | d | e | f |
那么对应到今天的题,我们就知道,咱们把同一个 size 的组对应的人先确认清楚,然后再来按照 size 来划分人就可以了,这很简单明确吧
按照题目中的示例 1 来进行推演:
groupSizes:
3 | 3 | 3 | 3 | 3 | 1 | 3 |
我们按照 size 来关联人,就可以得到这样的结果
Size 为 3 | 0 | 1 | 2 | 3 | 4 | 6 |
Size 为 1 | 5 |
那这个时候,我们按照 size 来拆分人就可以很简单的得出结果了
size为 3 的 1组 | 0 | 1 | 2 |
Size 为 3 的 2组 | 3 | 4 | 6 |
Size 为 1 | 5 |
按照上面这个思路,相信我们编码就是很容易的事情了吧,一起来撸代码吧
三、编码
根据上述逻辑和分析,我们就可以翻译成如下代码
- 先关联 size 和人
- 再来拆分人
编码如下:
func groupThePeople(groupSizes []int) [][]int { // 将组的大小 和 对应的人关联上关系 grps := map[int][]int{} for person, size := range groupSizes { grps[size] = append(grps[size], person) } // 根据关系 grps 来将人分组 res := [][]int{} for size,people := range grps { for i:=0; i<len(people); i+=size { res = append(res, people[i:i+size]) } } return res }
四、总结:
咱们这种实现方式的话,可以看到我们遍历了一次题目给出的源数组 groupSizes ,具体实现中,还可以看到我们使用了两个 for 循环来遍历我们自己构造的 grps, 实际上仔细的兄弟就可以看出来实际上,时间复杂度还是去解决第一个循环的逻辑,即为 O(n) ,实际上都是去遍历一遍题目给出的 groupSizes
空间复杂度则是最大为 O(n) ,咱们使用的哈希表的方式,需要开辟相应元素对应的空间
原题地址:1282. 用户分组
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~