侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 471 篇文章
  • 累计创建 108 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

【模拟, 前缀和】逐步求和得到正数的最小值

GabrielxD
2022-08-09 / 0 评论 / 0 点赞 / 73 阅读 / 449 字 / 正在检测是否收录...

题目

1413. 逐步求和得到正数的最小值


给你一个整数数组 nums 。你可以选定任意的 正数 startValue 作为初始值。

你需要从左到右遍历 nums 数组,并将 startValue 依次累加上 nums 数组中的值。

请你在确保累加和始终大于等于 1 的前提下,选出一个最小的 正数 作为 startValue 。

示例 1:

输入:nums = [-3,2,-3,4,2]
输出:5
解释:如果你选择 startValue = 4,在第三次累加时,和小于 1 。
                累加求和
                startValue = 4 | startValue = 5 | nums
                  (4 -3 ) = 1  | (5 -3 ) = 2    |  -3
                  (1 +2 ) = 3  | (2 +2 ) = 4    |   2
                  (3 -3 ) = 0  | (4 -3 ) = 1    |  -3
                  (0 +4 ) = 4  | (1 +4 ) = 5    |   4
                  (4 +2 ) = 6  | (5 +2 ) = 7    |   2

示例 2:

输入:nums = [1,2]
输出:1
解释:最小的 startValue 需要是正数。

示例 3:

输入:nums = [1,-2,-3]
输出:5

提示:

  • 1 <= nums.length <= 100
  • -100 <= nums[i] <= 100

解题

方法一:模拟 前缀和

思路

简单模拟,正序遍历数组,其间维护一个最小的前缀和(mn),那么根据题意在数组与 startValue 进行累加的过程中,会长生的最小值就是 startValue + mn ,所以在确保累加和始终大于等于 1 的前提下(startValue + mn >= 1),选出的最小正数就应该是 max(1, 1 - mn)

前缀和基础知识参见「前缀和基础」

代码

class Solution {
public:
    int minStartValue(vector<int>& nums) {
        int mn = numeric_limits<int>::max(), sum = 0;
        for (int& num : nums) {
            sum += num;
            if (sum < mn) mn = sum;
        }
        return max(1, 1 - mn);
    }
};
class Solution {
    public int minStartValue(int[] nums) {
        int sum = nums[0], min = sum;
        for (int i = 1; i < nums.length; ++i) {
            sum += nums[i];
            min = Math.min(min, sum);
        }
        return Math.max(1, 1 - min);
    }
}
0

评论区