LeetCode1802:有界数组中指定下标处的最大值

给你三个正整数 nindex 和 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;
    }
}

你可能感兴趣的:(真题,算法,数据结构,c++)