Kadane का Algorithm
current = best = arr[0]
for x in arr[1:]:
current = max(x, current + x)
best = max(best, current)
Kadane's Idea
Kadane का algorithm किसी भी contiguous subarray का maximum possible sum एक single linear O(n) pass में ढूंढता है, जो हर possible subarray सीधे जांचने वाले O(n²) या O(n³) approaches से नाटकीय रूप से तेज़ है।
उदाहरण: Kadane's Idea
#include <iostream>
using namespace std;
int main() {
int arr[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int maxSum = arr[0], curSum = arr[0];
for (int i = 1; i < 9; i++) {
curSum = max(arr[i], curSum + arr[i]);
maxSum = max(maxSum, curSum);
}
cout << "Max subarray sum: " << maxSum << endl;
return 0;
}
public class Main {
public static void main(String[] args) {
int[] arr = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int maxSum = arr[0], curSum = arr[0];
for (int i = 1; i < arr.length; i++) {
curSum = Math.max(arr[i], curSum + arr[i]);
maxSum = Math.max(maxSum, curSum);
}
System.out.println("Max subarray sum: " + maxSum);
}
}
arr = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
max_sum = cur_sum = arr[0]
for x in arr[1:]:
cur_sum = max(x, cur_sum + x)
max_sum = max(max_sum, cur_sum)
print("Max subarray sum:", max_sum)
#include <stdio.h>
int main() {
int arr[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int maxSum = arr[0], curSum = arr[0];
for (int i = 1; i < 9; i++) {
curSum = curSum + arr[i] > arr[i] ? curSum + arr[i] : arr[i];
if (curSum > maxSum) maxSum = curSum;
}
printf("Max subarray sum: %d\n", maxSum);
return 0;
}
Login to try C/C++/Java code in the editor
Running Sum
यह एक running current sum रखकर काम करता है: हर element पर, यह decide करें कि पिछले subarray को extend करना अब भी current element पर एक fresh subarray शुरू करने से बेहतर है या नहीं, जो भी running sum बड़ा हो उसे अब तक देखा गया best answer रखते हुए।
उदाहरण: Running Sum
#include <iostream>
using namespace std;
int main() {
int arr[] = {2, -1, 3, -4, 5};
int curSum = 0, best = arr[0];
for (int i = 0; i < 5; i++) {
curSum = (curSum > 0) ? curSum + arr[i] : arr[i];
cout << "After index " << i << ": running sum = " << curSum << endl;
best = max(best, curSum);
}
cout << "Best: " << best << endl;
return 0;
}
public class Main {
public static void main(String[] args) {
int[] arr = {2, -1, 3, -4, 5};
int curSum = 0, best = arr[0];
for (int i = 0; i < arr.length; i++) {
curSum = (curSum > 0) ? curSum + arr[i] : arr[i];
System.out.println("After index " + i + ": running sum = " + curSum);
best = Math.max(best, curSum);
}
System.out.println("Best: " + best);
}
}
arr = [2, -1, 3, -4, 5]
cur_sum, best = 0, arr[0]
for i, x in enumerate(arr):
cur_sum = cur_sum + x if cur_sum > 0 else x
print(f"After index {i}: running sum = {cur_sum}")
best = max(best, cur_sum)
print("Best:", best)
#include <stdio.h>
int main() {
int arr[] = {2, -1, 3, -4, 5};
int curSum = 0, best = arr[0];
for (int i = 0; i < 5; i++) {
curSum = (curSum > 0) ? curSum + arr[i] : arr[i];
printf("After index %d: running sum = %d\n", i, curSum);
if (curSum > best) best = curSum;
}
printf("Best: %d\n", best);
return 0;
}
Login to try C/C++/Java code in the editor
Maximum Subarray Details
सिर्फ maximum value से आगे, Kadane के algorithm को उस best subarray के exact start और end indexes track करने के लिए extend किया जा सकता है, जो तब उपयोगी है जब आपको सिर्फ sum नहीं बल्कि यह report करना हो कि कौन से elements ने इसे produce किया।
उदाहरण: Maximum Subarray Details
#include <iostream>
using namespace std;
int main() {
int arr[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int maxSum = arr[0], curSum = arr[0], start = 0, bestStart = 0, bestEnd = 0;
for (int i = 1; i < 9; i++) {
if (curSum < 0) { curSum = arr[i]; start = i; } else curSum += arr[i];
if (curSum > maxSum) { maxSum = curSum; bestStart = start; bestEnd = i; }
}
cout << "Sum: " << maxSum << " from index " << bestStart << " to " << bestEnd << endl;
return 0;
}
public class Main {
public static void main(String[] args) {
int[] arr = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int maxSum = arr[0], curSum = arr[0], start = 0, bestStart = 0, bestEnd = 0;
for (int i = 1; i < arr.length; i++) {
if (curSum < 0) { curSum = arr[i]; start = i; } else curSum += arr[i];
if (curSum > maxSum) { maxSum = curSum; bestStart = start; bestEnd = i; }
}
System.out.println("Sum: " + maxSum + " from index " + bestStart + " to " + bestEnd);
}
}
arr = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
max_sum = cur_sum = arr[0]
start = best_start = best_end = 0
for i in range(1, len(arr)):
if cur_sum < 0:
cur_sum, start = arr[i], i
else:
cur_sum += arr[i]
if cur_sum > max_sum:
max_sum, best_start, best_end = cur_sum, start, i
print(f"Sum: {max_sum} from index {best_start} to {best_end}")
#include <stdio.h>
int main() {
int arr[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int maxSum = arr[0], curSum = arr[0], start = 0, bestStart = 0, bestEnd = 0;
for (int i = 1; i < 9; i++) {
if (curSum < 0) { curSum = arr[i]; start = i; } else curSum += arr[i];
if (curSum > maxSum) { maxSum = curSum; bestStart = start; bestEnd = i; }
}
printf("Sum: %d from index %d to %d\n", maxSum, bestStart, bestEnd);
return 0;
}
Login to try C/C++/Java code in the editor
Circular Array
एक circular array के लिए, जहां subarray को आखिर से वापस शुरुआत तक wrap around होने दिया जाता है, maximum circular sum पूरे array sum माइनस minimum subarray sum के बराबर है (Kadane के ज़रिए उसी तरह ढूंढा गया, बस maximize करने के बजाय minimize करते हुए)।
उदाहरण: Circular Array
#include <iostream>
using namespace std;
int main() {
int arr[] = {5, -3, 5};
int total = 0, maxSum = arr[0], curMax = arr[0], minSum = arr[0], curMin = arr[0];
for (int i = 0; i < 3; i++) {
total += arr[i];
curMax = max(arr[i], curMax + arr[i]); maxSum = max(maxSum, curMax);
curMin = min(arr[i], curMin + arr[i]); minSum = min(minSum, curMin);
}
int maxCircular = (maxSum < 0) ? maxSum : max(maxSum, total - minSum);
cout << "Max circular sum: " << maxCircular << endl;
return 0;
}
public class Main {
public static void main(String[] args) {
int[] arr = {5, -3, 5};
int total = 0, maxSum = arr[0], curMax = arr[0], minSum = arr[0], curMin = arr[0];
for (int x : arr) {
total += x;
curMax = Math.max(x, curMax + x); maxSum = Math.max(maxSum, curMax);
curMin = Math.min(x, curMin + x); minSum = Math.min(minSum, curMin);
}
int maxCircular = (maxSum < 0) ? maxSum : Math.max(maxSum, total - minSum);
System.out.println("Max circular sum: " + maxCircular);
}
}
arr = [5, -3, 5]
total, cur_max, max_sum, cur_min, min_sum = 0, arr[0], arr[0], arr[0], arr[0]
for x in arr:
total += x
cur_max = max(x, cur_max + x); max_sum = max(max_sum, cur_max)
cur_min = min(x, cur_min + x); min_sum = min(min_sum, cur_min)
max_circular = max_sum if max_sum < 0 else max(max_sum, total - min_sum)
print("Max circular sum:", max_circular)
#include <stdio.h>
int main() {
int arr[] = {5, -3, 5};
int total = 0, maxSum = arr[0], curMax = arr[0], minSum = arr[0], curMin = arr[0];
for (int i = 0; i < 3; i++) {
total += arr[i];
curMax = (arr[i] > curMax + arr[i]) ? arr[i] : curMax + arr[i]; if (curMax > maxSum) maxSum = curMax;
curMin = (arr[i] < curMin + arr[i]) ? arr[i] : curMin + arr[i]; if (curMin < minSum) minSum = curMin;
}
int maxCircular = (maxSum < 0) ? maxSum : (maxSum > total - minSum ? maxSum : total - minSum);
printf("Max circular sum: %d\n", maxCircular);
return 0;
}
Login to try C/C++/Java code in the editor
Kadane's Practice
Kadane का algorithm कई 'maximum subarray'-style interview problems के पीछे है, लेकिन edge cases को carefully देखें, खासकर पूरी तरह negative arrays, जहां best answer बस सबसे बड़ा (least negative) single element है।
उदाहरण: Kadane's Practice
#include <iostream>
using namespace std;
int main() {
int arr[] = {-8, -3, -6, -2, -5, -4};
int maxSum = arr[0], curSum = arr[0];
for (int i = 1; i < 6; i++) {
curSum = max(arr[i], curSum + arr[i]);
maxSum = max(maxSum, curSum);
}
cout << "All-negative array best subarray sum: " << maxSum << endl;
return 0;
}
public class Main {
public static void main(String[] args) {
int[] arr = {-8, -3, -6, -2, -5, -4};
int maxSum = arr[0], curSum = arr[0];
for (int i = 1; i < arr.length; i++) {
curSum = Math.max(arr[i], curSum + arr[i]);
maxSum = Math.max(maxSum, curSum);
}
System.out.println("All-negative array best subarray sum: " + maxSum);
}
}
arr = [-8, -3, -6, -2, -5, -4]
max_sum = cur_sum = arr[0]
for x in arr[1:]:
cur_sum = max(x, cur_sum + x)
max_sum = max(max_sum, cur_sum)
print("All-negative array best subarray sum:", max_sum)
#include <stdio.h>
int main() {
int arr[] = {-8, -3, -6, -2, -5, -4};
int maxSum = arr[0], curSum = arr[0];
for (int i = 1; i < 6; i++) {
curSum = (arr[i] > curSum + arr[i]) ? arr[i] : curSum + arr[i];
if (curSum > maxSum) maxSum = curSum;
}
printf("All-negative array best subarray sum: %d\n", maxSum);
return 0;
}
Login to try C/C++/Java code in the editor
bestको0initialize करना, इसलिए एक all-negative array गलती से0return करता है बजाय सबसे बड़े negative number के।- Running sum को zero से नीचे गिरने पर reset न करना (या
max(x, cur + x)उपयोग न करना), इसलिए bad prefixes sum को नीचे खींच लेते हैं। - Running sum update करने से पहले best sum update करना, इसलिए एक value miss हो जाती है या देर से count होती है।
Chapter Quiz — Complete all 8 topics to unlock
0/8 topics done
Complete these topics first: