C ++中总和小于或等于给定总和的最大总和子数组
在这个问题上,我们得到一个数组和一个和。我们的任务是创建一个程序,该程序将找到总和小于或等于c++中给定总和的最大总和子数组。
我们必须找到任何长度小于或等于n且总和小于或等于给定总和的子数组。
让我们举个例子来了解这个问题,
输入-数组={3,5,1,8,2,9},sum=25
输出-25
说明-总和小于或等于25的子数组是{5,1,8,2,9}
找到最大总和子数组的一种简单方法是遍历数组,找到所有子数组的总和,然后找到最接近或相等的总和。但是由于需要两个循环,因此该方法的时间复杂度为O(n*n)。
解决此问题的更有效方法是使用滑动窗口方法。在其中,我们将使用最大和检查当前和,并根据比较将元素添加或减少到窗口中。
示例
该程序说明了我们解决方案的工作原理,
#include <iostream> using namespace std; int findMax(int a, int b){ if(a>b) return a; return b; } int maxSumsubarray(int arr[], int n, int maxSum){ int sum = arr[0], overallMax = 0, start = 0; for (int i = 1; i < n; i++) { if (sum <= maxSum) overallMax = findMax(overallMax, sum); while (sum + arr[i] > maxSum && start < i) { sum -= arr[start]; start++; } sum += arr[i]; } if (sum <= maxSum) overallMax = findMax(overallMax, sum); return overallMax; } int main(){ int arr[] = {3, 1, 4, 7, 2, 9, 5}; int n = sizeof(arr) / sizeof(arr[0]); int sum = 20; cout<<"The maximum sum of subarray with sum less than or equal to "<<sum<<" is "<<maxSumsubarray(arr, n, sum); return 0; }
输出结果
The maximum sum of subarray with sum less than or equal to 20 is 18