当前位置: 首页 > news >正文

前缀和题目:逐步求和得到正数的最小值

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:逐步求和得到正数的最小值

出处: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} 1nums.length100
  • -100 ≤ nums[i] ≤ 100 \texttt{-100} \le \texttt{nums[i]} \le \texttt{100} -100nums[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+sum1,因此需要满足 startValue ≥ − sum + 1 \textit{startValue} \ge -\textit{sum} + 1 startValuesum+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)

相关文章:

  • 打造智慧医疗枢纽,香港维尔利引领东南亚健康科技升级
  • 【Docker管理工具】部署Docker可视化管理面板Dpanel
  • LoRA:大模型高效微调的低秩之道——原理解析与技术实现
  • 【实施指南】Android客户端HTTPS双向认证实施指南
  • 摄像机ISP处理流程
  • 【华为云Astro-服务编排】服务编排使用全攻略
  • NLP学习路线图(二十六):自注意力机制
  • NC | 基于语言模型的药物设计新方法
  • Spring @Scheduled vs XXL-JOB vs DolphinScheduler vs Airflow:任务调度框架全景对比
  • 网页抓取混淆与嵌套数据处理流程
  • 检测到 #include 错误。请更新 includePath。已为此翻译单元(D:\软件\vscode\test.c)禁用波形曲线
  • BLOB 是用来存“二进制大文件”的字段类型
  • QMetaObject::invokeMethod调用失败
  • 基于rpc框架Dubbo实现的微服务转发实战
  • 【基础】每天掌握一个 Linux 命令:grep
  • ICLR文章如何寻找页码
  • cuda数据传输
  • Kubernetes (k8s)版本发布情况
  • 经典算法:回文链表
  • 使用VSCode开发Flask指南
  • 网站文字很少怎么做优化/宁波seo推广服务电话
  • 郴州网站建设/网站排名优化培训
  • 全国建设地产网站/seo优化包括哪些
  • 建设网站条件/百度怎么发免费广告
  • 湖南企业做网站/app推广拉新
  • 网站集约化建设规范/优化营商环境发言稿