【LeetCode】1282. 用户分组

76 阅读2分钟

image.png

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • groupSizes.length == n
    • 1 <= n <= 500
    • 1 <= groupSizes[i] <= n

二、思路分析:

我们拿到本题,读取题目内容要求对对n个用户进行分组,第i个人所在的组需要满足groupsize[i]人数中。看着题目,怎么比较拗口呢,那我们继续审题:

  • groupSizes中索引代表n个人的ID
  • groupSize[i] 中分组的人数
  • 根据每个人idex分组和人数分配到对应组
  • 每一个ID的人只能出现一个组中,且所在的组的人数也必须一致

根据题目的要求,因此对该题的解答我们可以使用哈希表的方式模拟解答即可,思路大致如下:

  • 根据groupSize中每小组的人数group作为key,用户ID列表作为value,定义一个groupdict
  • 使用for循环遍历groupSize中group不在groupdict.keys(),则groupdict[key]=[idex]
  • 当group在groupdict.keys()中,则添加到groupdict[key].append(idex)
  • 当group与len(groupdict[key])时,说明该小组分配完成添加到ans列表中,并删除groupdict.pop(group)
  • 根据以上思路,我们能快速使用python实现,代码如下:
    class Solution(object):
        def groupThePeople(self, groupSizes):
            """
            :type groupSizes: List[int]
            :rtype: List[List[int]]
            """
            groupdict = {}
            ans = []
    
            for idx,group in enumerate(groupSizes):
                if group not in groupdict.keys():
                    groupdict[group] = [idx]
                else:
                    groupdict[group].append(idx)
    
                if len(groupdict[group])== group:
                    ans.append(groupdict[group])
                    groupdict.pop(group)
    
            return ans
    

学习了一下,大佬们的优雅代码,get到本题中一个新的知识点:创建默认字典:

在一般情况下,我们创建字典有如下几种形式:

  • 默认空字典:tmp = {}
  • 使用dict():tmp = dict()
  • 使用zip()与dict(): tmp = dict(zip(list1,list2))
  • 使用Counter():tmp = Counter(list1) # 创建计算出list元素出现的次数
  • 使用defaultdict(): tmp = defaultdict(list)# 创建value为列表的默认字典
class Solution(object):
    def groupThePeople(self, groupSizes):
        """
        :type groupSizes: List[int]
        :rtype: List[List[int]]
        """
        groups = defaultdict(list)
        for i, size in enumerate(groupSizes):
            groups[size].append(i)
        ans = []
        for size, people in groups.items():
            ans.extend(people[i: i + size] for i in range(0, len(people), size))
        return ans

三、总结:

本题考察我们使用哈希表键值对思想,对groupSize进行分组。我们可以使用defaultdict()创建默认以list为value的字典,在分组时使用extend进行追加,AC提交记录如下:

image.png

  • 时间复杂度:O(n),n为groupSize的长度
  • 空间复杂度:O(n),n为groupSize的长度

以上是本期内容,欢迎大佬们点赞评论,下期见~~