给你三个正整数 n
、index
和 maxSum
。你需要构造一个同时满足下述所有条件的数组 nums
(下标 从 0 开始 计数):
nums.length == n
nums[i]
是 正整数 ,其中0 <= i < n
abs(nums[i] - nums[i+1]) <= 1
,其中0 <= i < n-1
nums
中所有元素之和不超过maxSum
nums[index]
的值被 最大化
返回你所构造的数组中的 nums[index]
。
注意:abs(x)
等于 x
的前提是 x >= 0
;否则,abs(x)
等于 -x
。
示例 1:
输入:n = 4, index = 2, maxSum = 6 输出:2 解释:数组 [1,1,2,1] 和 [1,2,2,1] 满足所有条件。不存在其他在指定下标处具有更大值的有效数组。
示例 2:
输入:n = 6, index = 1, maxSum = 10 输出:3
原题链接:https://leetcode.cn/problems/maximum-value-at-a-given-index-in-a-bounded-array/description/
方法:按照贪心思路进行数学推导
根据题意,需要构造一个长度为 n 的数组 nums,所有元素均为正整数,元素之和不超过 maxSum,相邻元素之差不超过 1,且需要最大化 nums[index]。根据贪心的思想,可以使 nums[index]成为数组最大的元素,并使其他元素尽可能小,即从 nums[index]开始,往左和往右,元素值就减少 1,直到到达数组边界,或者减少到仅为 1 后保持为 1 不变。
由此进行条件判断采用等差数列求和,遍历查找即可。
int maxValue(int n, int index, int maxSum){
if(n==1) return maxSum;//如果数组只有一个元素 返回最大值
//int res = maxSum/(index+1);//返回值
int res = (ceil)(maxSum/n);//返回值 这里res进行处理 节省时间
int p; //数组邻值
long long sum;//数组和
int left = index;
int right = n - index-1;
while(true){
sum = res;
//左边
if(res-left>0){
sum += (long long)(left*(2*res-left-1)/2);
}else{
sum += (long long)((left-res+1)+(res-1)*res/2);
}
//右边
if(res-right>0){
sum += (long long)(right*(2*res-right-1)/2);
}else{
sum += (long long)((right-res+1)+(res-1)*res/2);
}
if(sum>maxSum) return --res;//满足条件则返回 注意这时候sum>maxSum 需要--
else ++res;
}
}