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
热门推荐
10 朋友新年祝福语大全 简短
11 新年祝福语简短大方兔年
12 搬新家礼物祝福语简短
13 同学见面花束祝福语简短
14 五一假期祝福语幽默简短
15 离职欢送敬酒祝福语简短
16 对学弟的祝福语简短
17 考老师辞职祝福语简短
18 祝福语驱散霉运的话简短