โจทย์
ได้รับอาร์เรย์ arr[] ทางเราต้อง ตรวจสอบว่ามีซับอาร์เรย์ (Subarray) ที่ผลรวมเป็น 0 หรือไม่
ตัวอย่าง
Input: arr[] = {3, 1, -2, 1, 4, 5}
Output: Yes
อธิบาย: ซับอาร์เรย์ {1, -2, 1} ผลรวม = 0
แนวทางแก้ปัญหา
ใช้ Hashing (Prefix Sum):
- คำนวณ Prefix Sum ขณะท่องอาร์เรย์
- ถ้า Prefix Sum ซ้ำ (หรือเป็น 0) -> มีซับอาร์เรย์ผลรวม 0
- เก็บ Prefix Sum ใน Hash Set
โปรแกรมตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
bool isSubArraySumZero(int arr[], int n) {
unordered_set<int> sumHash;
int currSum = 0;
for (int i = 0; i < n; i++) {
currSum += arr[i];
if (currSum == 0 || sumHash.find(currSum) != sumHash.end()) return true;
sumHash.insert(currSum);
}
return false;
}
int main() {
int arr[] = {3, 1, -2, 1, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
if (isSubArraySumZero(arr, n))
cout << "SubArray with sum equal to 0 exists in the array";
else
cout << "No subarray exists";
return 0;
}
ผลลัพธ์
SubArray with sum equal to 0 exists in the array