代码改变世界

完整教程:【力扣LeetCode】 1413_逐步求和得到正数的最小值

2025-09-24 21:16  tlnshuju  阅读(16)  评论(0)    收藏  举报

- 第 130 篇 -
Date: 2025 - 09 - 23
Author: 郑龙浩(仟墨)

【力扣LeetCode】 1413_逐步求和得到正数的最小值

题目描述

给你一个整数数组 nums 。你许可选定任意的 正数 startValue 作为初始值。
你需要从左到右遍历 nums 数组,并将 startValue 依次累加上 nums 数组中的值。
请你在确保累加和始终大于等于 1 的前提下,选出一个最小的 正数 作为 startValue 。

题目分析|思路解析

:就是题目说成人话就
要找一个最小的正数 startValue,使得这个数加上数组中的每一个前缀和都>=1。
如果是这样的话,也就意味着,只要加最小的前缀和=1,其他更大的前缀和必然也可能
公式就是:startValue + 最小的前缀和 = 1,最小的前缀和与1,最小前缀和与1是可知的,startValue是未知的,所以整理可得公式:1 - 最小的前缀和 => startValue

:就是所以大概步骤就

  1. 算出所有的前缀和,在计算过程中求得最小的前缀和是多少
  2. 然后1 - 最小前缀和就得出了startValue
    我刚开始就没注意下面的点,导致结果是<1的时候返回了,此状况,应该返回1才正确。
    注意:求得startValue必须是>=1,于是假如结果是<1的,也只能返回1

代码

// 1413_逐步求和得到正数的最小值
// Author: 郑龙浩 Date: 2025年09月21日
// 用时:42min
// 思路:
// 题目说成人话就是:
// 要找一个最小的正数 startValue,使得这个数加上数组中的每一个前缀和都>=1。
// 如果是这样的话,也就意味着,只要加最小的前缀和=1,其他更大的前缀和必然也可以
// 公式就是:startValue + 最小的前缀和 = 1,最小的前缀和与1,最小前缀和与1是可知的,startValue是未知的,所以整理可得公式:
// 1 - 最小的前缀和 => startValue
// 所以大概步骤就是:
// 1 算出所有的前缀和,在计算过程中求得最小的前缀和是多少
// 2 然后1 - 最小前缀和就得出了startValue
// 我刚开始就没注意下面的点,导致结果是<1的时候返回了,此状况,应该返回1才正确。
// 注意:求得startValue必须是>=1,所以如果结果是<1的,也只能返回1
#include "bits/stdc++.h"
using namespace std;
class Solution
{
public:
int minStartValue(vector<
int>
& nums) {
int len = nums.size();
int min_sum = nums[0], sum = nums[0];
for (int i = 1; i < len; i++) {
sum += nums[i];
if (min_sum > sum) min_sum = sum;
}
int startValue = 1 - min_sum;
// 注意:求得startValue必须是>=1,所以如果结果是<1的,也只能返回1
if (startValue <
1) return 1;
else return startValue;
}
};
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
// vector <int> nums = {-3, 2, -3, 4, 2};
  vector <
  int> nums = {
  1, 2
  };
  // vector <int> nums = {1, -2, -3};
    Solution sol;
    cout << sol.minStartValue(nums);
    return 0;
    }