C++ 中查找具有给定和的子数组 - (处理负数)
在这个问题中,我们得到一个包含 N 个整数的数组 arr[],这些整数以无序的方式存储。我们的任务是查找具有给定和的子数组。
让我们举个例子来理解这个问题:
Input : arr[] = {2, 5, -1, 4, 6, -9, 5} sum = 14 Output : subarray = {5, -1, 4, 6}
解释 −
Subarray sum = 5 - 1 + 4 + 6 = 14
解决方案方法
解决这个问题的一个简单方法是使用嵌套循环。我们将遍历数组,并使用内循环查找子数组。对于每个子数组,我们将找到所有元素的和,并将其与给定的和值进行比较。如果相等,则打印子数组。如果遍历了数组的所有元素,则打印未找到这样的数组。
算法
步骤 1 − 遍历数组,i -> 0 到 (n-1)。
步骤 1.1 − 对于每个元素,查找所有可能的子数组的每个子数组的和。
步骤 1.2 − 如果当前子数组元素的和等于给定的子数组和,则打印子数组。
步骤 2 − 如果遍历了数组的所有元素并且没有找到子数组。打印“未找到具有给定和的子数组!”。
示例
程序说明我们解决方案的工作原理
#include <bits/stdc++.h> using namespace std; void printSubArray(int arr[], int i, int j){ cout<<"{ "; for(; i < j; i++) cout<<arr[i]<<" "; cout<<"}"; } int findSubArrayWithSum(int arr[], int n, int sum) { int currSum; for (int i = 0; i < n; i++) { currSum = arr[i]; for (int j = i + 1; j <= n; j++) { if (currSum == sum) { cout<<"Subarray with given sum : "; printSumArray(arr, i, j); return 1; } if (currSum >sum || j == n) break; currSum = currSum + arr[j]; } } cout<<"No subarray found"; return 0; } int main() { int arr[] = { 2, 5, -1, 4, 6, -9, 3}; int n = sizeof(arr) / sizeof(arr[0]); int sum = 14; findSubArrayWithSum(arr, n, sum); return 0; }
输出
Subarray with given sum : { 5 -1 4 6 }
解决这个问题的更好方法是使用哈希表。哈希表将存储到当前索引的总和。对于任何索引,检查是否存在具有总和的子数组。我们将检查是否存在具有 sum = sum - value 的前缀。
示例
程序说明我们解决方案的工作原理
#include <bits/stdc++.h> using namespace std; void printSubArray(int arr[], int i, int j){ cout<<"{ "; for(; i <= j; i++) cout<<arr[i]<<" "; cout<<"}"; } void findSubArrayWithSum(int arr[], int n, int sum) { unordered_map<int, int> map; int curr_sum = 0; for (int i = 0; i < n; i++){ curr_sum = curr_sum + arr[i]; if (curr_sum == sum) { cout<<"SubArray with the given sum :"; printSubArray(arr, 0, i); return; } if (map.find(curr_sum - sum) != map.end()) { cout<<"SubArray with the given sum : "; printSubArray(arr, map[curr_sum - sum] + 1 , i); return; } map[curr_sum] = i; } cout<<"No subarray found!"; } int main() { int arr[] = { 2, 5, -1, 4, 6, 9, 3}; int n = sizeof(arr) / sizeof(arr[0]); int sum = 14; findSubArrayWithSum(arr, n, sum); return 0; }
输出
SubArray with the given sum : { 5 -1 4 6 }
广告