Kadane's Algorithm หา Maximum Sum ของ Contiguous Subarray ใน O(N) Time, O(1) Space วิธีคิดคือ Dynamic Programming แบบเก็บเฉพาะ State ที่จำเป็น
Algorithm Logic
ที่ Index i เรามี 2 ทางเลือก:
- เริ่ม Subarray ใหม่ที่ i:
arr[i] - ต่อยอด Subarray ก่อนหน้า:
currentMax + arr[i]
เลือก Max ของทั้งสอง → currentMax = max(arr[i], currentMax + arr[i])
อัปเดต Global Max: globalMax = max(globalMax, currentMax)
โค้ด C++
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
// Return pair: {maxSum, {startIdx, endIdx}}
pair> kadane(const vector& arr) {
long long maxSum = LLONG_MIN;
long long currSum = 0;
int start = 0, end = 0, tempStart = 0;
for (int i = 0; i < arr.size(); i++) {
if (currSum + arr[i] < arr[i]) {
currSum = arr[i];
tempStart = i;
} else {
currSum += arr[i];
}
if (currSum > maxSum) {
maxSum = currSum;
start = tempStart;
end = i;
}
}
return {maxSum, {start, end}};
}
int main() {
// Example from article
vector arr = {-1, -2, -3, -4, -5, 6, 7};
auto result = kadane(arr);
cout << "Array: ";
for (int x : arr) cout << x << " ";
cout << "\nMaximum Subarray Sum: " << result.first;
cout << "\nSubarray indices: [" << result.second.first << ", " << result.second.second << "]";
cout << "\nSubarray: ";
for (int i = result.second.first; i <= result.second.second; i++)
cout << arr[i] << " ";
cout << '\n';
return 0;
}
ผลลัพธ์
Array: -1 -2 -3 -4 -5 6 7 Maximum Subarray Sum: 13 Subarray indices: [5, 6] Subarray: 6 7
Edge Cases
| Case | Behavior |
|---|---|
| All Negative | คืนค่า Element ที่ใหญ่ที่สุด (น้อยที่สุดค่าลบ) ต้อง Initialize maxSum = LLONG_MIN |
| All Positive | คืนค่า Sum ทั้ง Array |
| Empty Array | Handle แยก (Return 0 หรือ Error) |
| Single Element | คืนค่า Element นั้น |