You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求使数组running sum始终不小于1的最小初始值x

求解满足Running Sum全程不低于1的最小初始值x

嘿,我明白你为啥觉得暴力试x的方法不靠谱了——要是数组里有一堆负数值,那得试到猴年马月啊!其实咱们换个思路,抓住问题的核心,就能一步算出最小的x。

核心思路

咱们要保证每一步的累加和(running sum)都≥1,本质上就是要让累加过程中的「最低谷」也能≥1。那怎么找到这个最低谷呢?

其实所有的running sum都可以写成 x + 前缀和 的形式:

  • 初始的running sum是 x + 0(还没加任何数组元素)
  • 加第一个元素后是 x + arr[0]
  • 加前两个元素后是 x + arr[0]+arr[1]
  • ...以此类推

这里的「前缀和」是从0开始,依次累加数组元素得到的序列。我们只需要找到这个前缀和序列里的最小值,就能算出x的最小值了。

具体步骤

  1. 计算前缀和序列(必须包含初始的0,对应还没加任何元素的状态)
  2. 找出前缀和序列的最小值 min_sum
  3. 计算最小x:x = max(1, 1 - min_sum)
    • 这里用max(1, ...)是为了防止当min_sum为正数时,1 - min_sum变成负数,这时候x取1就足够了(因为初始x本身就要≥1,不然第一步就不满足)

用你的示例验证

数组 arr = [-2, 3, 1, -5]

  1. 计算前缀和序列:
    • 0(初始状态)
    • 0 + (-2) = -2
    • -2 + 3 = 1
    • 1 + 1 = 2
    • 2 + (-5) = -3
  2. 前缀和的最小值是 -3
  3. 计算x:1 - (-3) = 4,正好是示例里的正确结果!

再举个例子巩固

比如数组 arr = [1, -2, 3]

  1. 前缀和序列:0, 1, -1, 2
  2. 最小值是 -1
  3. x = 1 - (-1) = 2
    验证一下:x=2时,running sum是2→3→1→4,全程都≥1;如果x=1的话,中间会出现0,不符合要求,完美!

为啥暴力法不行?

暴力法是从0开始逐个试x,要是遇到前缀和最小值是-1000的情况,你得试1001次才能找到答案,效率太低了。而这个方法只需要遍历数组一次计算前缀和,再找个最小值,O(n)的时间复杂度,高效又准确。

内容的提问来源于stack exchange,提问作者now he who must not be named.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:32:37