2829. k-avoiding 数组的最小总和 - 力扣(LeetCode)
class Solution {
public int minimumSum(int n, int k) {
int res=0,count=0,x=1;
HashSet<Integer> hs=new HashSet<>();
while(count<n){
if(!hs.contains(k-x)){
hs.add(x);
res+=x;
count++;
}
x++;
}
return res;
}
}
class Solution:
def minimumSum(self, n: int, k: int) -> int:
res = 0 # 存储数组元素的总和
count = 0 # 记录已选数字的个数
x = 1 # 当前尝试的数字,从1开始
hs = set() # 存储已选的数字,用于快速查找
while count < n:
# 检查k - x是否未被选中(即x可以与已选数字共存)
if (k - x) not in hs:
hs.add(x) # 将x加入已选集合
res += x # 累加x到总和
count += 1 # 已选数字个数加1
x += 1 # 尝试下一个数字
return res # 返回最小总和
代码思路
该问题的目标是构造一个长度为 n
的数组,满足以下条件:
-
数组中的元素都是不同的正整数。
-
数组中不存在任何两个不同的元素,其和等于
k
。 -
在所有满足条件的数组中,选择元素总和最小的那个。
为了达到这个目标,我们采用贪心算法:
-
优先选择较小的数字:因为较小的数字可以使得总和最小。
-
避免冲突的和:如果选择数字
x
,则不能选择k - x
(如果k - x
是正整数且未被选择)。 -
逐步构建数组:从
1
开始逐个尝试数字,确保每次选择的数字不与已选数字中的任何一个形成和为k
的对。