C++程序中排除某些元素的最大子数组和
在这个问题中,我们得到了两个数组 arr1[],大小为 n,和 arr2[],大小为 m。我们的任务是创建一个程序来查找排除某些元素的最大子数组和。
问题描述 − 我们需要从数组 arr1[] 中的元素中找到最大子数组和,这些元素不在 arr2[] 中。
让我们举个例子来理解这个问题,
输入
arr1[] = {4, 5, 7, 2, 9}, arr2[] = {1, 9, 2, 7}输出
9
解释
arr1 after removal of elements of arr2[] = {4, 5}
Both can form a subarray, hence sum = 4+5 = 9.解决方案方法
解决该问题的一个简单方法是使用 Kadane 算法,在该算法中,我们可以找到数组的所有正连续序列。找到此子序列中所有元素的总和,然后返回其中的最大值。我们将根据以下事实更新算法:我们不需要考虑 arr2[] 元素的最大子数组,为此,我们将使用搜索算法搜索元素。如果它存在于 arr2 中,我们将清除当前窗口并重置窗口。检查总和是否小于 maxSum,maxSum = sum。
示例
程序说明我们解决方案的工作原理,
#include <iostream>
using namespace std;
int isInArr2(int arr2[], int start, int end, int searchEle){
if (end >= start) {
int mid = start + (end − start) / 2;
if (arr2[mid] == searchEle)
return true;
if (arr2[mid] > searchEle)
return isInArr2(arr2, start, mid − 1, searchEle);
return isInArr2(arr2, mid + 1, end, searchEle);
}
return false;
}
int calcMaxSubArraySum(int arr1[], int arr2[], int n, int m){
int maxSum = −1, sum = 0;
for (int i = 0; i < n; i++) {
if (isInArr2(arr2, 0, m, arr1[i])) {
sum = 0;
continue;
}
sum = max(arr1[i], sum + arr1[i]);
maxSum = max(maxSum, sum);
}
return maxSum;
}
int main(){
int arr1[] = { 5, 4, 7, 2, 9 };
int arr2[] = { 1, 9, 2, 7 };
int n = sizeof(arr1) / sizeof(arr1[0]);
int m = sizeof(arr2) / sizeof(arr2[0]);
cout<<"The maximum Subarray Sum Excluding Certain Elements is
"<<calcMaxSubArraySum(arr1, arr2, n, m);
return 0;
}输出
The maximum Subarray Sum Excluding Certain Elements is 9
此解决方案有效,但可能存在更好的方法来检查第二个数组中是否存在元素,这将节省一些计算时间。以下是如何使用映射来实现的方法 -
在这种方法中,我们将使用我们更新后的 Kadane 算法,并且通过将我们的搜索算法替换为基于映射的检查来进一步更新,以检查数组中是否存在元素,这将非常有效。
示例
程序说明我们解决方案的工作原理,
#include <bits/stdc++.h>
using namespace std;
int calcMaxSubArraySum(int arr1[], int arr2[], int n, int m){
unordered_map<int,int> checkVal;
for(int i=0;i<m;i++)
checkVal[arr2[i]] = 1;
int maxSum = −1, sum = 0;
for (int i = 0; i < n; i++) {
if (checkVal[arr1[i]]==1) {
sum = 0;
continue;
}
sum = max(arr1[i], sum + arr1[i]);
maxSum = max(maxSum, sum);
}
return maxSum;
}
int main(){
int arr1[] = { 5, 4, 7, 2, 9 };
int arr2[] = { 1, 9, 2, 7 };
int n = sizeof(arr1) / sizeof(arr1[0]);
int m = sizeof(arr2) / sizeof(arr2[0]);
cout<<"The maximum Subarray Sum Excluding Certain Elements is "<<calcMaxSubArraySum(arr1, arr2, n, m);
return 0;
}输出
The maximum Subarray Sum Excluding Certain Elements is 9
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP