在 C++ 中刪除最多一個元素後最大化最大子陣列和
問題陳述
給定一個由 N 個整陣列成的陣列 arr[]。任務是首先找到最大子陣列和,然後從該子陣列中最多移除一個元素。最多移除單個元素,以使移除後的最大和最大化。
如果給定的輸入陣列為 {1, 2, 3, -2, 3},則最大子陣列和為 {2, 3, -2, 3}。然後,我們可以移除 -2。移除後,其餘陣列變為-
{1, 2, 3, 3} with sum 9 which is maximum.演算法
1. Use Kadane’s algorithm to find the maximum subarray sum. 2. Once the sum has beens find, re-apply Kadane’s algorithm to find the maximum sum again with some minor changes)
示例
#include <bits/stdc++.h>
using namespace std;
int getMaxSubarraySum(int *arr, int n){
int max = INT_MIN;
int currentMax = 0;
for (int i = 0; i < n; ++i) {
currentMax = currentMax + arr[i];
if (max < currentMax) {
max = currentMax;
}
if (currentMax < 0) {
currentMax = 0;
}
}
return max;
}
int getMaxSum(int *arr, int n){
int cnt = 0;
int minVal = INT_MAX;
int minSubarr = INT_MAX;
int sum = getMaxSubarraySum(arr, n);
int max = INT_MIN;
int currentMax = 0;
for (int i = 0; i < n; ++i) {
currentMax = currentMax + arr[i];
++cnt;
minSubarr = min(arr[i], minSubarr);
if (sum == currentMax) {
if (cnt == 1) {
minVal = min(minVal, 0);
} else {
minVal = min(minVal, minSubarr);
}
}
if (currentMax < 0) {
currentMax = 0;
cnt = 0;
minSubarr = INT_MAX;
}
}
return sum - minVal;
}
int main(){
int arr[] = {1, 2, 3, -2, 3};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Maximum sum = " << getMaxSum(arr, n) << endl;
return 0;
}輸出
當您編譯並執行上述程式時。它生成以下輸出-
Maximum sum = 9
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP