likes
comments
collection
share

1282. 用户分组 : 简单哈希表模拟题

作者站长头像
站长
· 阅读数 44

题目描述

这是 LeetCode 上的 1282. 用户分组 ,难度为 中等

Tag : 「哈希表」、「模拟」

有 n 个人被分成数量未知的组。每个人都被标记为一个从 000n−1n - 1n1 的唯一ID 。

给定一个整数数组 groupSizes,其中 groupSizes[i] 是第 iii 个人所在的组的大小。例如,如果 groupSizes[1] = 3,则第 111 个人必须位于大小为 333 的组中。

返回一个组列表,使每个人 iii 都在一个大小为 groupSizes[i] 的组中。

每个人应该恰好只出现在 一个组中,并且每个人必须在一个组中。如果有多个答案,返回其中任何一个。可以保证给定输入至少有一个有效的解。

示例 1:

输入:groupSizes = [3,3,3,3,3,1,3]

输出:[[5],[0,1,2],[3,4,6]]

解释:
第一组是 [5],大小为 1,groupSizes[5] = 1。
第二组是 [0,1,2],大小为 3,groupSizes[0] = groupSizes[1] = groupSizes[2] = 3。
第三组是 [3,4,6],大小为 3,groupSizes[3] = groupSizes[4] = groupSizes[6] = 3。 
其他可能的解决方案有 [[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==ngroupSizes.length == ngroupSizes.length==n
  • 1<=n <=5001 <= n <= 5001<=n <=500
  • 1<= groupSizes[i]<=n1 <= groupSizes[i] <= n1<= groupSizes[i]<=n

哈希表 + 模拟

我们可以使用「哈希表」将所属组大小相同的下标放到一起。假设组大小为 kkk 的元素有 mmm 个,然后我们再将这 mmm 个元素按照 kkk 个一组进行划分即可。

Java 代码:

class Solution {
    public List<List<Integer>> groupThePeople(int[] gs) {
        Map<Integer, List<Integer>> map = new HashMap<>();
        for (int i = 0; i < gs.length; i++) {
            List<Integer> list = map.getOrDefault(gs[i], new ArrayList<>());
            list.add(i);
            map.put(gs[i], list);
        }
        List<List<Integer>> ans = new ArrayList<>();
        for (int k : map.keySet()) {
            List<Integer> list = map.get(k), cur = new ArrayList<>();
            for (int i = 0; i < list.size(); i++) {
                cur.add(list.get(i));
                if (cur.size() == k) {
                    ans.add(cur);
                    cur = new ArrayList<>();
                }
            }
        }
        return ans;
    }
}

Typescript 代码:

function groupThePeople(gs: number[]): number[][] {
    const map = new Map<number, Array<number>>()
    for (let i = 0; i < gs.length; i++) {
        if (!map.has(gs[i])) map.set(gs[i], new Array<number>())
        map.get(gs[i]).push(i)
    }
    const ans = new Array<Array<number>>()
    for (let k of map.keys()) {
        let list = map.get(k), cur = new Array<number>()
        for (let i = 0; i < list.length; i++) {
            cur.push(list[i])
            if (cur.length == k) {
                ans.push(cur)
                cur = new Array<number>()
            }
        }
    }
    return ans
};
  • 时间复杂度:O(n)O(n)O(n)
  • 空间复杂度:O(n)O(n)O(n)

最后

这是我们「刷穿 LeetCode」系列文章的第 No.1282 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…

在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

转载自:https://juejin.cn/post/7130795522087993352
评论
请登录