LC 2834. 找出美丽数组的最小和

2834. 找出美丽数组的最小和

难度 : 中等

题目大意

给你两个正整数:ntarget

如果数组 nums 满足下述条件,则称其为 美丽数组

  • nums.length == n.
  • nums 由两两互不相同的正整数组成。
  • 在范围 [0, n-1] 内,不存在 两个 不同 下标 ij ,使得 nums[i] + nums[j] == target

返回符合条件的美丽数组所可能具备的 最小 和,并对结果进行取模 10^9 + 7

提示:

  • 1 <= n <= 10^9
  • 1 <= target <= 10^9

示例 1:

输入:n = 2, target = 3
输出:4
解释:nums = [1,3] 是美丽数组。
- nums 的长度为 n = 2 。
- nums 由两两互不相同的正整数组成。
- 不存在两个不同下标 i 和 j ,使得 nums[i] + nums[j] == 3 。
可以证明 4 是符合条件的美丽数组所可能具备的最小和。

分析

首先我们发现题目的数据范围很大,肯定是不能暴力解决,首先我们想一下怎么选才能让他们的和最小,首先肯定是从小到大进行选择, 如果选了一个数,那么根据题目的要求,在数组中不能存在nums[i] + nums[j] == target,也就是说假设我们选的这个数字是x,那么target - x肯定要被剔除不能选,那么就有思路了,要总和最小,那么我们从小到大选,选完一个数就把对应的一个数字(存在的情况下)删除,那么怎么计算呢,前面就说了不能暴力枚举,但是我们简单的模拟一下就能发现其中的规律,我们最多选target / 2个数字,并且我们选的这些数字是一段连续的正整数,我们可以使用等差数列求和的方式进行求解,(首项 + 末项) * 项数 / 2但是还有一个问题

  1. 如果n > target / 2的时候,并且我们在1 ~ target - 1中最多选target / 2,那么我们就要在target ~ +inf中选剩下的数字,选多少个呢,显然是n - target / 2个,这一段也是连续的正整数,也就是说我们也可以用等差数列求和的方式进行计算

  2. 如果n <= target / 2,那么我们就只需要计算一段即可,也就是在1 ~ target - 1中选最最前面的n个数字,这样就全部解决了

注意别忘记取模

数学推理 + 贪心

class Solution {
public:
    using LL = long long;
    int minimumPossibleSum(int n, int target) {
        int MOD = 1e9 + 7;
        int cnt = n >= target / 2 ? target / 2 : n;
        LL res = (1ll + cnt) * cnt / 2 % MOD;
        if (n - cnt > 0) res = (res + (target * 2ll + n - cnt - 1) * (n - cnt) / 2) % MOD;
        return res;
    }
};

时间复杂度 : O ( 1 ) O(1) O(1)

结束了

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值