280.k-avoiding 数组的最小总和

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 的数组,满足以下条件:

  1. 数组中的元素都是不同的正整数。

  2. 数组中不存在任何两个不同的元素,其和等于 k

  3. 在所有满足条件的数组中,选择元素总和最小的那个。

为了达到这个目标,我们采用贪心算法:

  • 优先选择较小的数字:因为较小的数字可以使得总和最小。

  • 避免冲突的和:如果选择数字 x,则不能选择 k - x(如果 k - x 是正整数且未被选择)。

  • 逐步构建数组:从 1 开始逐个尝试数字,确保每次选择的数字不与已选数字中的任何一个形成和为 k 的对。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值