LeetCode 题解工作台

将元素分配给有约束条件的组

给你一个整数数组 groups ,其中 groups[i] 表示第 i 组的大小。另给你一个整数数组 elements 。 请你根据以下规则为每个组分配 一个 元素: 如果 groups[i] 能被 elements[j] 整除,则下标为 j 的元素可以分配给组 i 。 如果有多个元素满足条件,则分…

category

2

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

中等 · 数组·哈希·扫描

bolt

答案摘要

我们先找到数组 中的最大值,记为 。用一个数组 记录每个元素对应的下标,初始时 $\textit{d}[x] = -1$ 表示元素 还没有被分配。 然后我们遍历数组 ,对于每个元素 ,如果 $x > \textit{mx}$ 或者 $\textit{d}[x] \neq -1$,说明元素 无法被分配或者已经被分配,直接跳过。否则,我们从 开始,每次加上 ,将 设为 ,表示元素 被分配…

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 数组·哈希·扫描 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个整数数组 groups,其中 groups[i] 表示第 i 组的大小。另给你一个整数数组 elements

请你根据以下规则为每个组分配 一个 元素:

  • 如果 groups[i] 能被 elements[j] 整除,则下标为 j 的元素可以分配给组 i
  • 如果有多个元素满足条件,则分配 最小的下标 j 的元素。
  • 如果没有元素满足条件,则分配 -1 。

返回一个整数数组 assigned,其中 assigned[i] 是分配给组 i 的元素的索引,若无合适的元素,则为 -1。

注意:一个元素可以分配给多个组。

 

示例 1:

输入: groups = [8,4,3,2,4], elements = [4,2]

输出: [0,0,-1,1,0]

解释:

  • elements[0] = 4 被分配给组 0、1 和 4。
  • elements[1] = 2 被分配给组 3。
  • 无法为组 2 分配任何元素,分配 -1 。

示例 2:

输入: groups = [2,3,5,7], elements = [5,3,3]

输出: [-1,1,0,-1]

解释:

  • elements[1] = 3 被分配给组 1。
  • elements[0] = 5 被分配给组 2。
  • 无法为组 0 和组 3 分配任何元素,分配 -1 。

示例 3:

输入: groups = [10,21,30,41], elements = [2,1]

输出: [0,1,0,1]

解释:

elements[0] = 2 被分配给所有偶数值的组,而 elements[1] = 1 被分配给所有奇数值的组。

 

提示:

  • 1 <= groups.length <= 105
  • 1 <= elements.length <= 105
  • 1 <= groups[i] <= 105
  • 1 <= elements[i] <= 105
lightbulb

解题思路

方法一:枚举

我们先找到数组 groups\textit{groups} 中的最大值,记为 mx\textit{mx}。用一个数组 d\textit{d} 记录每个元素对应的下标,初始时 d[x]=1\textit{d}[x] = -1 表示元素 xx 还没有被分配。

然后我们遍历数组 elements\textit{elements},对于每个元素 xx,如果 x>mxx > \textit{mx} 或者 d[x]1\textit{d}[x] \neq -1,说明元素 xx 无法被分配或者已经被分配,直接跳过。否则,我们从 xx 开始,每次加上 xx,将 d[y]\textit{d}[y] 设为 jj,表示元素 yy 被分配给了下标 jj

最后我们遍历数组 groups\textit{groups},根据 d\textit{d} 数组的记录,得到答案。

时间复杂度 O(M×logm+n)O(M \times \log m + n),空间复杂度 O(M)O(M)。其中 nnmm 分别是数组 groups\textit{groups}elements\textit{elements} 的长度;而 MM 是数组 groups\textit{groups} 中的最大值。

1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
    def assignElements(self, groups: List[int], elements: List[int]) -> List[int]:
        mx = max(groups)
        d = [-1] * (mx + 1)
        for j, x in enumerate(elements):
            if x > mx or d[x] != -1:
                continue
            for y in range(x, mx + 1, x):
                if d[y] == -1:
                    d[y] = j
        return [d[x] for x in groups]
speed

复杂度分析

指标
时间Depends on the final approach
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Test if the candidate can optimize array scanning with hashing.

  • question_mark

    Look for understanding of sieve-like techniques applied to grouping problems.

  • question_mark

    Assess if the candidate avoids redundant work by using appropriate data structures.

warning

常见陷阱

外企场景
  • error

    Failing to use efficient data structures like hash tables leads to inefficient solutions.

  • error

    Overlooking cases where no suitable element is available, leading to incorrect -1 assignments.

  • error

    Not handling the edge cases where groups or elements are exhausted early.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Change the problem to require exact group size matching instead of any available element.

  • arrow_right_alt

    Introduce additional constraints on elements, like limited reuse or an order of assignment.

  • arrow_right_alt

    Allow multiple elements per group, adding complexity to the assignment logic.

help

常见问题

外企场景

将元素分配给有约束条件的组题解:数组·哈希·扫描 | LeetCode #3447 中等