目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:. - 力扣(LeetCode)
描述:
给你两个正整数: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开始。
我们把target分为两种:
第一种,target>=2*n,这种场景下,最小和就是1到n的累加和。
第二种,假设target是6,n=7。那么组成的可能是[1,5],[2,4]。所以1,2,3,的数组中,如果选择了1就不能选择5,同理4也不能选。所以我们可以选择的部分分为两段,第一段1到3,4到5不能选择,第二段从6开始。
所以第一段范围是[1,1 + leftLength - 1],第二段范围是[target,target + n - leftLength - 1],leftLength=target/2。
代码:
class Solution {
public:
int minimumPossibleSum(int n, int target)
{
if (target >= 2 * n)
{
return getFragmentSum(1, n) % 1000000007;
}
int leftLength = target / 2;
int leftStart = 1;
int leftEnd = leftStart + leftLength - 1;
int rightStart = target;
int rightEnd = rightStart + n - leftLength - 1;
return (getFragmentSum(leftStart, leftEnd) + getFragmentSum(rightStart, rightEnd)) % 1000000007;
}
long long getFragmentSum(long long start, long long end)
{
return (start + end) * (end - start + 1) / 2;
}
};