LeetCode2829
LeetCode.2829:k-avoiding 数组的最小总和
这道题我在解的时候只关注了贪心的算法,本来有试着去优化,后来发现好像没有什么优化的必要,就直接暴力拆了。
题目描述
给你两个整数 n
和 k
。
对于一个由 不同 正整数组成的数组,如果其中不存在任何求和等于 k 的不同元素对,则称其为 k-avoiding 数组。
返回长度为 n
的 k-avoiding 数组的可能的最小总和。
示例
示例1:
1 | 输入:n = 5, k = 4 |
示例2:
1 | 输入:n = 2, k = 6 |
提示:
1 | 1 <= n, k <= 50 |
我的题解:贪心
index
从1开始,如果index
和k_avoiding
中的每一个数字组成数字对,如果它们的和不等于k
,则将新的数字加入到k_avoiding
中,如果它们的和等于k
则不加入,去检索下一个index
,直到k_avoiding
中已加入的数字数量为n
为止,此时返回k_avoiding
中前n
项和即可。
size
用于记录已加入k_avoiding
中的元素数量;index
记录当前检查的数字。
我的代码
1 | class Solution { |
复杂度分析:
- 时间复杂度:$O(n^2)$
- 空间复杂度:$O(n)$
accumulate(vector.begin(),vector.end(),0)
,定义于<numeric.h>
,用法:
求vector.begin()
到vector.end()
的和,并从0
开始累加。要求容器内类型必须与第三个实参的类型匹配,或者可转换为第三个实参的类型。也可以用来连接字符串:
1 | //这个函数调用的效果是:从空字符串开始,把vec里的每个元素连接成一个字符串。 |
官方题解:贪心 + 等差数列求和
根据题目要求,在k是奇数的情况下,如果某个正整数a在数组中,那么k-a则不能在数组中。反之亦然。但是题目要求总和最小,故而肯定选择a和k-a中更小的数字放入数组,并且从1开始挑选数字放入数组,直到$\lceil k/2 \rceil$为止。这之后的数字到k-1为止,都不能放入数组。如果此时数字还未到达n个,则需要从k开始,再挑选连续的$k-\lceil k/2 \rceil$个数字加入数组。因此最后的数组和是一段或两端等差数列求和的结果。
故而依靠一个等差数列求和的函数,即可获得答案。
官方题解代码
1 | class Solution { |
复杂度分析:
- 时间复杂度:$O(1)$
- 空间复杂度:$O(1)$