返回介绍

solution / 1500-1599 / 1526.Minimum Number of Increments on Subarrays to Form a Target Array / README

发布于 2024-06-17 01:03:18 字数 3597 浏览 0 评论 0 收藏 0

1526. 形成目标数组的子数组最少增加次数

English Version

题目描述

给你一个整数数组 target 和一个数组 initial ,initial 数组与 target  数组有同样的维度,且一开始全部为 0 。

请你返回从 initial 得到  target 的最少操作次数,每次操作需遵循以下规则:

  • initial 中选择 任意 子数组,并将子数组中每个元素增加 1 。

答案保证在 32 位有符号整数以内。

 

示例 1:

输入:target = [1,2,3,2,1]
输出:3
解释:我们需要至少 3 次操作从 intial 数组得到 target 数组。
[0,0,0,0,0] 将下标为 0 到 4 的元素(包含二者)加 1 。
[1,1,1,1,1] 将下标为 1 到 3 的元素(包含二者)加 1 。
[1,2,2,2,1] 将下表为 2 的元素增加 1 。
[1,2,3,2,1] 得到了目标数组。

示例 2:

输入:target = [3,1,1,2]
输出:4
解释:(initial)[0,0,0,0] -> [1,1,1,1] -> [1,1,1,2] -> [2,1,1,2] -> [3,1,1,2] (target) 。

示例 3:

输入:target = [3,1,5,4,2]
输出:7
解释:(initial)[0,0,0,0,0] -> [1,1,1,1,1] -> [2,1,1,1,1] -> [3,1,1,1,1] 
                  -> [3,1,2,2,2] -> [3,1,3,3,2] -> [3,1,4,4,2] -> [3,1,5,4,2] (target)。

示例 4:

输入:target = [1,1,1,1]
输出:1

 

提示:

  • 1 <= target.length <= 10^5
  • 1 <= target[i] <= 10^5

解法

方法一:动态规划

我们定义 $f[i]$ 表示得到 $target[0,..i]$ 的最少操作次数,初始时 $f[0] = target[0]$。

对于 $target[i]$,如果 $target[i] \leq target[i-1]$,则 $f[i] = f[i-1]$;否则 $f[i] = f[i-1] + target[i] - target[i-1]$。

最终答案即为 $f[n-1]$。

我们注意到 $f[i]$ 只与 $f[i-1]$ 有关,因此可以只用一个变量来维护操作次数。

时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 $target$ 的长度。

class Solution:
  def minNumberOperations(self, target: List[int]) -> int:
    return target[0] + sum(max(0, b - a) for a, b in pairwise(target))
class Solution {
  public int minNumberOperations(int[] target) {
    int f = target[0];
    for (int i = 1; i < target.length; ++i) {
      if (target[i] > target[i - 1]) {
        f += target[i] - target[i - 1];
      }
    }
    return f;
  }
}
class Solution {
public:
  int minNumberOperations(vector<int>& target) {
    int f = target[0];
    for (int i = 1; i < target.size(); ++i) {
      if (target[i] > target[i - 1]) {
        f += target[i] - target[i - 1];
      }
    }
    return f;
  }
};
func minNumberOperations(target []int) int {
  f := target[0]
  for i, x := range target[1:] {
    if x > target[i] {
      f += x - target[i]
    }
  }
  return f
}
function minNumberOperations(target: number[]): number {
  let f = target[0];
  for (let i = 1; i < target.length; ++i) {
    if (target[i] > target[i - 1]) {
      f += target[i] - target[i - 1];
    }
  }
  return f;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文