前缀和题目:逐步求和得到正数的最小值
文章目录
- 题目
- 标题和出处
- 难度
- 题目描述
- 要求
- 示例
- 数据范围
- 解法
- 思路和算法
- 代码
- 复杂度分析
题目
标题和出处
标题:逐步求和得到正数的最小值
出处:1413. 逐步求和得到正数的最小值
难度
2 级
题目描述
要求
给定一个整数数组 nums \texttt{nums} nums,选定一个正数 startValue \texttt{startValue} startValue 作为初始值。
每一轮,将 startValue \texttt{startValue} startValue 与数组 nums \texttt{nums} nums 中的元素(从左到右)累加求和。
返回最小的正数 startValue \texttt{startValue} startValue,使得累加和总是大于等于 1 \texttt{1} 1。
示例
示例 1:
输入: nums = [-3,2,-3,4,2] \texttt{nums = [-3,2,-3,4,2]} nums = [-3,2,-3,4,2]
输出: 5 \texttt{5} 5
解释:如果选择 startValue = 4 \texttt{startValue = 4} startValue = 4,在第三次累加时,和小于 1 \texttt{1} 1。
选择 startValue = 4 \texttt{startValue = 4} startValue = 4 对应的每次累加和依次是: [1,3,0,4,6] \texttt{[1,3,0,4,6]} [1,3,0,4,6]。
选择 startValue = 5 \texttt{startValue = 5} startValue = 5 对应的每次累加和依次是: [2,4,1,5,7] \texttt{[2,4,1,5,7]} [2,4,1,5,7]。
示例 2:
输入: nums = [1,2] \texttt{nums = [1,2]} nums = [1,2]
输出: 1 \texttt{1} 1
解释:最小的 startValue \texttt{startValue} startValue 是正数。
示例 3:
输入: nums = [1,-2,-3] \texttt{nums = [1,-2,-3]} nums = [1,-2,-3]
输出: 5 \texttt{5} 5
数据范围
- 1 ≤ nums.length ≤ 100 \texttt{1} \le \texttt{nums.length} \le \texttt{100} 1≤nums.length≤100
- -100 ≤ nums[i] ≤ 100 \texttt{-100} \le \texttt{nums[i]} \le \texttt{100} -100≤nums[i]≤100
解法
思路和算法
由于 startValue \textit{startValue} startValue 是正整数,因此其最小值是 1 1 1,将 startValue \textit{startValue} startValue 初始化为 1 1 1。
每个元素的累加和等于 startValue \textit{startValue} startValue 加上数组中从首个元素到该元素的所有元素的前缀和,因此从左到右遍历数组,遍历过程中依次计算每个元素的前缀和,并确保累加和总是不小于 1 1 1。
用 sum \textit{sum} sum 表示前缀和,从左到右遍历数组的过程中,依次将每个元素加到 sum \textit{sum} sum,则累加和是 startValue + sum \textit{startValue} + \textit{sum} startValue+sum。为了确保累加和总是不小于 1 1 1,需要确保对于每个元素都满足 startValue + sum ≥ 1 \textit{startValue} + \textit{sum} \ge 1 startValue+sum≥1,因此需要满足 startValue ≥ − sum + 1 \textit{startValue} \ge -\textit{sum} + 1 startValue≥−sum+1。每次更新 sum \textit{sum} sum 的值之后,如果 startValue < − sum + 1 \textit{startValue} < -\textit{sum} + 1 startValue<−sum+1,则将 startValue \textit{startValue} startValue 的值更新为 − sum + 1 -\textit{sum} + 1 −sum+1。遍历结束后, startValue \textit{startValue} startValue 即为确保累加和总是不小于 1 1 1 的最小值。
由于 startValue \textit{startValue} startValue 的初始值为 1 1 1,每次更新 startValue \textit{startValue} startValue 都只会将值增加,因此可以确保 startValue \textit{startValue} startValue 是正数。
代码
class Solution {public int minStartValue(int[] nums) {int startValue = 1;int sum = 0;int length = nums.length;for (int i = 0; i < length; i++) {sum += nums[i];startValue = Math.max(startValue, -sum + 1);}return startValue;}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 nums \textit{nums} nums 的长度。需要遍历数组一次计算每个元素的前缀和。
-
空间复杂度: O ( 1 ) O(1) O(1)。