开云官方体育app官网

开云官方体育app 2026-02-13: 至多 K 个不同元素的最大和。用go说话, 输入为一个仅

开云官方体育app 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,开云体育app这一步后也只会保留一个。

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/}

}

func main {

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

k := 3

result := maxKDistinct(nums, k)

fmt.Println(result)

}

{jz:field.toptypename/}

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助力您的将来发展。




  • 下一篇:没有了