2834. 找出美丽数组的最小和
给你两个正整数:n
和 target
。
如果数组 nums
满足下述条件,则称其为 美丽数组 。
nums.length == n
.nums
由两两互不相同的正整数组成。- 在范围
[0, n-1]
内,不存在 两个 不同 下标i
和j
,使得nums[i] + nums[j] == target
。
返回符合条件的美丽数组所可能具备的 最小 和,并对结果进行取模 109 + 7
。
示例 1:
输入:n = 2, target = 3
输出:4
解释:nums = [1,3] 是美丽数组。
- nums 的长度为 n = 2 。
- nums 由两两互不相同的正整数组成。
- 不存在两个不同下标 i 和 j ,使得 nums[i] + nums[j] == 3 。
可以证明 4 是符合条件的美丽数组所可能具备的最小和。
示例 2:
输入:n = 3, target = 3
输出:8
解释:
nums = [1,3,4] 是美丽数组。
- nums 的长度为 n = 3 。
- nums 由两两互不相同的正整数组成。
- 不存在两个不同下标 i 和 j ,使得 nums[i] + nums[j] == 3 。
可以证明 8 是符合条件的美丽数组所可能具备的最小和。
示例 3:
输入:n = 1, target = 1
输出:1
解释:nums = [1] 是美丽数组。
提示:
1 <= n <= 109
1 <= target <= 109
解题思路
已知美丽数组有三个条件,前两个条件可以通过构建从1到n的数组满足,最后一个条件需要在此基础上对数组进行调整。
如果2*n<target
,则无需进行调整,直接返回1到n的整数和S=(1+n)*n/2
;
如果2*n<target
,需要对数组进行调整,即所有小于target/2
的部分保持原样,因为这个区域内的元素不可能出现两个元素和达到target的情况;原右边的元素(范围[target/2,n]
)向右迁移到[target, target + (n-target/2-1)]
。这个问题就被转化为了求等差数列之和。此时记k1 = target/2
,k2=n-k1
,分别表示左侧元素和右侧元素个数。则数组和:
S = S1 + S2 = (1+k1)*k1/2 + (target + target+k2-1)*k2/2
代码实现
class Solution {public int minimumPossibleSum(int n, int target) {int mod = 1000000007;if(target > 2*n ){return (int)(((long)((1 + n)*n/2))%mod);}long k1 = target/2, k2 = n-k1 ;return (int)((((1+k1)*k1)/2 + ((target + target + k2 - 1)*k2)/2)%mod);}
}
踩坑点
容易踩坑的地方在于,涉及到整数乘法,用int会发生溢出
。因此,可以先用long存储乘法结果,取模后再转为int类型