求使数组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的最小值了。
具体步骤
- 计算前缀和序列(必须包含初始的0,对应还没加任何元素的状态)
- 找出前缀和序列的最小值
min_sum - 计算最小x:
x = max(1, 1 - min_sum)- 这里用
max(1, ...)是为了防止当min_sum为正数时,1 - min_sum变成负数,这时候x取1就足够了(因为初始x本身就要≥1,不然第一步就不满足)
- 这里用
用你的示例验证
数组 arr = [-2, 3, 1, -5]
- 计算前缀和序列:
- 0(初始状态)
- 0 + (-2) = -2
- -2 + 3 = 1
- 1 + 1 = 2
- 2 + (-5) = -3
- 前缀和的最小值是
-3 - 计算x:
1 - (-3) = 4,正好是示例里的正确结果!
再举个例子巩固
比如数组 arr = [1, -2, 3]
- 前缀和序列:0, 1, -1, 2
- 最小值是
-1 - 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.
相关产品推荐
相关产品推荐

