LeetCode 1802. 有界数组中指定下标处的最大值(思维题)

文章目录

1. 题目

给你三个正整数 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
 
提示:
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处为2
        int 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;//每个数+1
            if(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阿明),一起加油、一起学习进步!
Michael阿明

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页