3914. 使数组非递减需要的最小累计值
May 3, 2026 · View on GitHub
题目描述
给你一个长度为 n 的整数数组 nums。
一次操作中,你可以选择任意一个 子数组 nums[l..r],并将该 子数组 中的每个元素都增加 x,其中 x 可以是任意正整数。
返回使数组变为 非递减 所需的所有操作中,所选 x 的值之和可能达到的 最小值。
如果对于所有 0 <= i < n - 1,都有 nums[i] <= nums[i + 1],则称数组是 非递减 的。
子数组 是数组中一个连续、 非空 的元素序列。
示例 1:
输入: nums = [3,3,2,1]
输出: 2
解释:
一种最优操作方案为:
- 选择子数组
[2..3],并增加x = 1,得到[3, 3, 3, 2] - 选择子数组
[3..3],并增加x = 1,得到[3, 3, 3, 3]
数组变为非递减,所选 x 的总和为 1 + 1 = 2。
示例 2:
输入: nums = [5,1,2,3]
输出: 4
解释:
一种最优操作方案为:
- 选择子数组
[1..3],并增加x = 4,得到[5, 5, 6, 7]
数组变为非递减,所选 x 的总和为 4。
提示:
1 <= n == nums.length <= 1051 <= nums[i] <= 109
解法
方法一:贪心
我们可以从左到右遍历数组,统计每对相邻元素之间的差值。如果当前元素比前一个元素小,那么我们需要增加当前元素,使其至少和前一个元素相等。增加的值就是前一个元素与当前元素的差值。
时间复杂度 ,其中 是数组的长度。空间复杂度 。
Python3
class Solution:
def minOperations(self, nums: list[int]) -> int:
return sum(max(a - b, 0) for a, b in pairwise(nums))
Java
class Solution {
public long minOperations(int[] nums) {
long ans = 0;
for (int i = 1; i < nums.length; ++i) {
ans += Math.max(nums[i - 1] - nums[i], 0);
}
return ans;
}
}
C++
class Solution {
public:
long long minOperations(vector<int>& nums) {
long long ans = 0;
for (int i = 1; i < nums.size(); ++i) {
ans += max(nums[i - 1] - nums[i], 0);
}
return ans;
}
};
Go
func minOperations(nums []int) (ans int64) {
for i := 1; i < len(nums); i++ {
ans += max(int64(nums[i-1]-nums[i]), 0)
}
return
}
TypeScript
function minOperations(nums: number[]): number {
let ans = 0;
for (let i = 1; i < nums.length; ++i) {
ans += Math.max(nums[i - 1] - nums[i], 0);
}
return ans;
}