米兰体育
米兰体育官方网站-milan 2026-01-24: 数组元素分组。用go语言, 给定一个整数数组 nums 和一

milan 2026-01-24: 数组元素分组。用go语言, 给定一个整数数组 nums 和一

发布日期:2026-01-26 22:48  点击次数:164

milan 2026-01-24: 数组元素分组。用go语言, 给定一个整数数组 nums 和一

2026-01-24:数组元素分组。用go语言,给定一个整数数组 nums 和一个整数 k,判断能否把数组里的所有元素划分成若干个大小为 k 的子集合,要求每个子集合内部没有重复值,并且数组中的每个元素只能出现在一个子集合中。若存在满足这些条件的划分方案则返回 true,否则返回 false。

1

1

1

输入: nums = [1,2,3,4], k = 2。

输出: true。

解释:

一种可能的分组方式是分成 2 组:

组 1:[1, 2]

组 2:[3, 4]

每个组包含 k = 2 个不同的元素,并且所有元素都被恰好使用一次。

题目来自力扣3659。

过程描述

1. 检查数组长度是否能被 k 整除

首先判断数组长度 n 是否能被 k 整除。

如果 n % k != 0,则不可能划分成若干个大小为 k 的子集合,直接返回 false。

2. 统计每个数字的出现次数

创建一个计数数组 cnt,长度是 nums 中的最大值加 1(为了用下标直接映射数字)。

遍历数组 nums,对每个数字 x,增加 cnt[x] 的计数。

3. 检查某个数字出现次数是否过多

在遍历并统计的过程中,对于每个 x,如果 cnt[x] 大于 n/k,则立刻返回 false。

这是因为:

• 一共要分成 n/k 组,每组 k 个不同的数字。

• 如果某个数字出现的次数大于组数 n/k,milan那么必然至少有一组会出现两次这个数字,违反“每组内部无重复值”的条件。

4. 返回结果

如果前面没有返回 false,则返回 true。

注意:这里代码没有进一步验证是否存在具体的分组方案,只做了必要条件的判断。

对于本题的约束条件(数字范围有限,且出现次数不超过 n/k),数学上可以证明必然存在一种分组方案,因此代码只需做上述检查即可。

时间复杂度分析

• 遍历数组统计最大值:O(n)。

• 创建计数数组并初始化(Go 中会自动零值初始化):O(M),其中 M = max(nums) + 1。

• 遍历数组统计频次并检查 cnt[x] > n/k:O(n)。

总时间复杂度:O(n + M),其中 M 是数组中最大元素的值加 1(最大 100001)。

额外空间复杂度分析

• 主要额外空间是计数数组 cnt,大小为 M = max(nums) + 1。

所以额外空间复杂度:O(M),其中 M ≤ 100001。

Go完整代码如下:

{jz:field.toptypename/}

package main

import (

"fmt"

"slices"

)

func partitionArray(nums []int, k int)bool {

n := len(nums)

{jz:field.toptypename/}

if n%k > 0 {

returnfalse

}

cnt := make([]int, slices.Max(nums)+1)

for _, x := range nums {

cnt[x]++

if cnt[x] > n/k {

returnfalse

}

}

returntrue

}

func main {

nums := []int{1, 2, 3, 4}

k := 2

result := partitionArray(nums, k)

fmt.Println(result)

}

Python完整代码如下:

# -*-coding:utf-8-*-

def partitionArray(nums, k):

n = len(nums)

if n % k > 0:

return False

max_val = max(nums)

cnt = [0] * (max_val + 1)

for x in nums:

cnt[x] += 1

if cnt[x] > n // k:

return False

return True

# 测试用例

nums = [1, 2, 3, 4]

k = 2

result = partitionArray(nums, k)

print(result)

C++完整代码如下:

#include

#include

#include

bool partitionArray(std::vector& nums, int k) {

int n = nums.size;

if (n % k > 0) {

returnfalse;

}

int maxVal = *std::max_element(nums.begin, nums.end);

std::vector cnt(maxVal + 1, 0);

for (int x : nums) {

cnt[x]++;

if (cnt[x] > n / k) {

returnfalse;

}

}

returntrue;

}

int main {

std::vector nums = {1, 2, 3, 4};

int k = 2;

bool result = partitionArray(nums, k);

std::cout

return0;

}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。

欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。



推荐资讯
热点资讯
  • 友情链接:

Copyright © 1998-2026 米兰体育官方网站™版权所有

jswxtsj.com 备案号 备案号: 

技术支持:® RSS地图 HTML地图