Table of contents


Given problem

Given an array of integers nums, you start with an initial positive value startValue.

In each iteration, you calculate the step by step sum of startValue plus elements in nums (from left to right).

Return the minimum positive value of startValue such that the step by step sum is never less than 1.

Example 1:
Input: nums = [-3,2,-3,4,2]
Output: 5
Explanation: If you choose startValue = 4, in the third iteration your step by step sum is less than 1.
                step by step sum
                startValue = 4 | startValue = 5 | nums
                  (4 -3 ) = 1  | (5 -3 ) = 2    |  -3
                  (1 +2 ) = 3  | (2 +2 ) = 4    |   2
                  (3 -3 ) = 0  | (4 -3 ) = 1    |  -3
                  (0 +4 ) = 4  | (1 +4 ) = 5    |   4
                  (4 +2 ) = 6  | (5 +2 ) = 7    |   2

Example 2:
Input: nums = [1,2]
Output: 1
Explanation: Minimum start value should be positive.

Example 3:
Input: nums = [1,-2,-3]
Output: 5

Constraints:
1 <= nums.length <= 100
-100 <= nums[i] <= 100


Using brute force algorithm

From the requirements, we can find that the step by step sum of the startValue and all elements of an array is never less than 1.

So, we will choose the initial value of startValue = 1.

For each sum of startValue and elements of an array is less than 1, exit the loop. Otherwise, immediately return the value of startValue.

public int minStartValue(int[] nums) {
    int minStartValue = 1;

    while (true) {
        int startValue = minStartValue;
        boolean isMinValue = true;
        for (int i = 0; i < nums.length; ++i) {
            startValue += nums[i];
            if (startValue < 1) {
                isMinValue = false;
                break;
            }
        }

        if (isMinValue) {
            return minStartValue;
        }

        ++minStartValue;
    }
}


Using prefix sum technique

Before jump directly into source code of this section, we need to read an article about Prefix sum.

The idea here is that we will calculate the sum of elements at specific index, then we will find the minimum sum in prefix sum array.

And the minimum value of start value that satisfies start value + minimum sum = 1.

public int minStartValue(int[] nums) {
    int[] prefixSum = new int[nums.length];
    prefixSum[0] = nums[0];
    int minSum = prefixSum[0];

    for (int i = 1; i < nums.length; ++i) {
        prefixSum[i] += prefixSum[i - 1] + nums[i];
        minSum = Math.min(minSum, prefixSum[i]);
    }

    return 1 - minSum < 1 ? 1 : 1 - minSum;
}


Using binary search algorithm

Our idea is that we need to find the value of startValue variable from 1 to N. It means that its value is belong to a sorted array. So we can use Binary Search for this problem.


Using Kadane algorithm


Wrapping up

  • Identify some particular traits to apply algorithms, techniques such as prefix sum, binary search, kadane algorithm.


Refer:

https://leetcode.com/problems/minimum-value-to-get-positive-step-by-step-sum/