你的位置:乐鱼体育官方网站 > 乐鱼盘口 >
乐鱼 2026-02-13: 至多 K 个不同元素的最大和。用go言语, 输入为一个仅
发布日期:2026-02-15 11:11    点击次数:195

乐鱼 2026-02-13: 至多 K 个不同元素的最大和。用go言语, 输入为一个仅

2026-02-13:至多 K 个不同元素的最大和。用go言语,输入为一个仅包含正整数的列表 nums 和一个整数 k。条目从该列表中挑出未几于 k 个互不调换的数,使这组数的和尽可能大。限定以一个数组复返,数组中的元素按从大到小的限定摆设(严格递减)。

1

1

1

输入: nums = [84,93,100,77,90], k = 3。

输出: [100,93,90]。

证明:

最大和为 283,不错通过接纳 93、100 和 90 杀青。将它们按严格递减限定摆设,得到 [100, 93, 90]。

题目来独力扣3684。

️ 分门径经由神情

1. 降序排序

当先,代码使用 slices.SortFunc 对输入的整数切片 nums 进行降序(从大到小)排序。排序函数 func(a, b int) int { return b - a } 通过野心 b - a 来细目限定,若是限定为负数,阐发 a 应排在 b 后头,从而杀青了降序摆设。这一步的方向是将最大的数字放在最前边,为后续接纳作念准备。排序后的限定为 [100, 93, 90, 84, 77]。

2. 原地去重

接着,代码使用 slices.Compact 函数对已排序的切片进行去重操作。slices.Compact 会修改原始切片,威斯人通过将聚会不重叠的元素秩序前移,并复返一个只包含不重叠元素的新切片。由于上一步如故进行了排序,总计调换的数字都会紧挨在一都,因此 slices.Compact 不错高效地移除总计重叠项,只保留每个值的第一次出现。举例,若是原数组有重叠的 100,乐鱼这一步后也只会保留一个。

3. 接纳前K个元素

去重后,代码通过切片操作 nums[:min(k, len(nums))] 来选取最终限定。这个操作会取现时 nums 切片的前 min(k, len(nums)) 个元素。这里的 min 函数(代码中未显式界说,但逻辑上是取最小值)是一个保护性门径,确保当所需的不同元素数目 k 大于切片中本色存在的不同元素数目时,不会发生数组越界诞妄。最终,函数复返这个包含至多 k 个最大不同元素的切片。

⏱️ 复杂度分析

• 总的时辰复杂度:该算法的时辰复杂度主要由排序门径决定。slices.SortFunc 使用的排序算法(如快速排序)的平均时辰复杂度为 O(n log n),其中 n 是输入列表 nums 的长度。去重操作 slices.Compact 需要遍历通盘切片,时辰复杂度为 O(n)。接纳前K个元素是 O(1) 的切片操作。因此,总的时辰复杂度为 O(n log n) + O(n),主导项是 O(n log n)。

• 总的非凡空间复杂度:该算法的空间效果很高。排序操作 slices.SortFunc 是原地进行的,一样需要 O(log n) 的栈空间(递归深度)。去重操作 slices.Compact 亦然原地完成的,不需要非凡分派空间。因此,总的非凡空间复杂度为 O(log n)。

Go齐备代码如下:

package main

import (

"fmt"

"slices"

)

func maxKDistinct(nums []int, k int) []int {

slices.SortFunc(nums, func(a, b int)int { return b - a })

nums = slices.Compact(nums) // 原地去重

return nums[:min(k, len(nums))]

{jz:field.toptypename/}{jz:field.toptypename/}

}

func main {

nums := []int{84, 93, 100, 77, 90}

k := 3

result := maxKDistinct(nums, k)

fmt.Println(result)

}

Python齐备代码如下:

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

def max_k_distinct(nums, k):

# 降序排序

nums = sorted(nums, reverse=True)

# 去重并保捏限定

seen = set

unique_nums = []

for num in nums:

if num not in seen:

seen.add(num)

unique_nums.append(num)

# 复返前k个元素

return unique_nums[:min(k, len(unique_nums))]

def main:

nums = [84, 93, 100, 77, 90]

k = 3

result = max_k_distinct(nums, k)

print(result)

if __name__ == "__main__":

main

C++齐备代码如下:

#include

#include

#include

#include

std::vector maxKDistinct(std::vector nums, int k) {

// 降序排序

std::sort(nums.begin, nums.end, std::greater);

// 去重

std::unordered_set seen;

std::vector unique_nums;

for (int num : nums) {

if (seen.find(num) == seen.end) {

seen.insert(num);

unique_nums.push_back(num);

}

}

// 复返前k个元素

int limit = std::min(k, (int)unique_nums.size);

return std::vector(unique_nums.begin, unique_nums.begin + limit);

}

int main {

std::vector nums = {84, 93, 100, 77, 90};

int k = 3;

std::vector result = maxKDistinct(nums, k);

for (int i = 0; i

std::cout

if (i

std::cout

}

}

std::cout

return0;

}

咱们敬佩东说念主工智能为鄙俚东说念主提供了一种“增强用具”,并尽力于于共享全地点的AI常识。在这里,您不错找到最新的AI科普著作、用具评测、提高效果的阴事以及行业细察。

接待海涵“福大大架构师逐日一题”,发音问可得到口试贵府,让AI助力您的将来发展。



乐鱼体育官方网站
推荐资讯