Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

minimum sum subarray in O(N) by Kadane's algorithm

We all know about the maximum sum subarray and the famous Kadane's algorithm. But can we use the same algorithm to find minimum sum also?

My take is:

change the sign and find the max sum in that, same as the way we calculate the maximum sum subarray. Than change the sign of the elements in the array to make it in initial state.

Please help me in correcting the algo if it has any issue.

corner case: I know there is an issue if all the elements are positive and we can handle this case by doing some preprocessing i.e. traverse the array if all are +ve than just return the minimum number from the array.

The above mention algorithm will work and well supported (explained) by dasblinkenlight.

like image 449
Trying Avatar asked Aug 27 '13 18:08

Trying


People also ask

How do you find the sum of a minimum Subarray?

Minimum Size Subarray Sum - LeetCode. Given an array of positive integers nums and a positive integer target , return the minimal length of a contiguous subarray [numsl, numsl+1, ..., numsr-1, numsr] of which the sum is greater than or equal to target . If there is no such subarray, return 0 instead.

What is kadane's algorithm?

Kadane's Algorithm is an iterative dynamic programming algorithm. It calculates the maximum sum subarray ending at a particular position by using the maximum sum subarray ending at the previous position.

What is the run time complexity of kadane's algorithm?

Or to be more precise, the time complexity of Kadane's Algorithm is O(n).

Where is kadane's algorithm used?

Used as an image processing algorithm. It can be used to solve the problems like “Station Travel in Order” and “Hotels Along the Coast” It is used for business analysis.


2 Answers

Will the approach that I have mentioned work to find the minimum sum?

Yes, it will. You can re-state the problem of finding the minimum sum as finding a negative sum with the largest absolute value. When you switch the signs of your numbers and keep the rest of the algorithm in place, that's the number that the algorithm is going to return back to you.

I know there is an issue if all the elements are positive

No, there's no issue: consider the original Kadane's algorithm when all elements are negative. In this case the algorithm returns an empty sequence for the sum of zero - the highest one possible under the circumstances. In other words, when all elements are negative, your best solution is to take none of them.

Your modified algorithm is going to do the same in case when all numbers are positive: again, your best solution is to not take numbers at all.

If you add a requirement that the range returned back from the algorithm may not be empty, you could modify the algorithm slightly to find the smallest positive number (or the greatest negative number) in case when Kadane's algorithm returns an empty range as the optimal solution.

like image 176
Sergey Kalinichenko Avatar answered Sep 20 '22 07:09

Sergey Kalinichenko


Just replace max with min.

//O(n)
public static int minSubArraySum(int[] arr) {
    int minSum = 0;
    int curSum = 0;
    for (int num : arr) {
        curSum += num;
        minSum = Math.min(minSum, curSum);
        curSum = Math.min(curSum, 0);
    }
    return minSum;
}
like image 23
yadongwen Avatar answered Sep 23 '22 07:09

yadongwen