文章目录
- 1. 题目
- 2. 解题
1. 题目
给你三个正整数 n、index 和 maxSum 。
你需要构造一个同时满足下述所有条件的数组 nums(下标 从 0 开始 计数):
nums.length == n
nums[i]
是 正整数 ,其中 0 <= i < nabs(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提示:
1 <= n <= maxSum <= 10^9
0 <= index < n
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-value-at-a-given-index-in-a-bounded-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 首先全部为1,idx处为2,然后提拉idx处,慢慢向两侧扩展,每次扩展区域需要全部+1
class Solution {
public:int maxValue(int n, int index, int maxSum) {if(n==1) return maxSum;//特殊情况if(n == maxSum)return 1;int v = 2;//其余的为1,idx处为2int s = n+1;int n1 = index, n2 = n-index-1;//左右两边的长度(不含idx处)int len1 = 0, len2 = 0;//实际需要被拉起来的区间长度while(s < maxSum){len1 += (len1 < n1 ? 1 : 0);len2 += (len2 < n2 ? 1 : 0);v++;//idx处的数s += 1 + len1 +len2;//每个数+1if(len1+len2 == n-1)//全部需要被拉起break;}if(s > maxSum)return v-1;int t = (maxSum - s)/n;//还可以每个数增加多少return v+t;}
};
12 ms 5.8 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!