Skip to content

Latest commit

 

History

History

1802

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

You are given three positive integers n, index and maxSum. You want to construct an array nums (0-indexed) that satisfies the following conditions:

  • nums.length == n
  • nums[i] is a positive integer where 0 <= i < n.
  • abs(nums[i] - nums[i+1]) <= 1 where 0 <= i < n-1.
  • The sum of all the elements of nums does not exceed maxSum.
  • nums[index] is maximized.

Return nums[index] of the constructed array.

Note that abs(x) equals x if x >= 0, and -x otherwise.

 

Example 1:

Input: n = 4, index = 2,  maxSum = 6
Output: 2
Explanation: The arrays [1,1,2,1] and [1,2,2,1] satisfy all the conditions. There are no other valid arrays with a larger value at the given index.

Example 2:

Input: n = 6, index = 1,  maxSum = 10
Output: 3

 

Constraints:

  • 1 <= n <= maxSum <= 109
  • 0 <= index < n

Related Topics:
Binary Search, Greedy

Solution 1. Binary Answer

// OJ: https://leetcode.com/problems/maximum-value-at-a-given-index-in-a-bounded-array/
// Author: github.com/lzl124631x
// Time: O(log(maxSum))
// Space: O(1)
class Solution {
    long count(long len, long M) {
        return M >= len ? (2 * M - len + 1) * len / 2 : ((M - 1) * M / 2 + len);
    }
    bool valid(long n, long i, long maxSum, long M) {
        long left = count(i + 1, M), right = count(n - i, M);
        return left + right - M <= maxSum;
    }
public:
    int maxValue(int n, int index, int maxSum) {
        int L = 1, R = maxSum;
        while (L <= R) {
            int M = (L + R) / 2;
            if (valid(n, index, maxSum, M)) L = M + 1;
            else R = M - 1;
        }
        return R;
    }
};