- 2025/03
-
- [2829. k-avoiding 数组的最小总和](#2829. k-avoiding 数组的最小总和)
2025/03
2829. k-avoiding 数组的最小总和

python
class Solution:
def minimumSum(self, n: int, k: int) -> int:
# 思路:对任何一个正整数 x,不能同时存在 k-x
nums = []
ans = 2501
def backtrace(x):
nonlocal ans
if sum(nums) > ans: # 剪枝,比 ans 还大不需要考虑
return
if len(nums) == n: # 终止条件,数组塞满了
ans = min(sum(nums), ans)
return
for i in range(1, 80):
if i not in nums and (k - i) not in nums: # 当 k-i 不在数组中才可以选
nums.append(i) # 做选择
backtrace(x+1) # 递归
nums.pop() # 撤销选择
return
backtrace(1) # 从小的正整数开始
return ans
不出意外就会超时了!
贪心吧,举例来说, 假设不能选和为 4 的数对,肯定选 1 不选 3 啊! O ( n ) O(n) O(n),
python
class Solution:
def minimumSum(self, n: int, k: int) -> int:
# 思路:对任何一个正整数 x,不能同时存在 k-x
nums = []
sum = 0
for i in range(1, 100):
if len(nums) == n: # 如果够 n 个就退出循环
break
if (k-i) not in nums: # k-i 不在就塞进数组
nums.append(i)
sum += i
return sum
过了,但是还能优化,直接上数学公式, O ( 1 ) O(1) O(1),
python
class Solution:
def minimumSum(self, n: int, k: int) -> int:
# 思路:对任何一个正整数 x,不能同时存在 k-x
if 2 * n <= k:
return sum(range(1, n + 1)) # 注意 range 左闭右开
part_num = k - (k // 2 + 1)
return sum(range(1, k // 2 + 1)) + sum(range(k, n + part_num + 1))