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类型