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 妈妈生日祝福语简短励志