在这个问题中,我们得到了一个大小为n的数组arr [],该数组由正值组成。我们的任务是创建一个程序来查找最大和子数组,以使开始和结束值相同。
问题描述-在这里,我们需要找到一个子数组,使索引i(子数组的起始索引)和j(子数组的结束索引)处的元素相同,即arr [i] = arr [j]。并且子数组的元素之和被最大化。
让我们举个例子来了解这个问题,
arr[] = {2, 1, 3, 5, 6, 2, 4, 3}
输出结果
23
All subarrays which are starting and ending with the same element are: {2, 1, 3, 5, 6, 2} = 2 + 1 + 3 + 5 + 6 + 2 = 19 {3, 5, 6, 2, 4, 3} = 3 + 5 + 6 + 2 + 4 + 3 = 23
为了解决该问题,我们需要考虑以下事实:对于正值,子数组的总和会随我们考虑的子数组的大小而增加。为此,我们将通过查找数组中最左边和最右边的数字来找到具有最大大小的子数组。如果大于maxSum,则返回它们的和。
该程序说明了我们解决方案的工作原理,
#include <bits/stdc++.h> using namespace std; int maxValue(int arr[], int n) { unordered_map<int, int> startIndex, endIndex; int sumArr[n]; sumArr[0] = arr[0]; for (int i = 1; i < n; i++) { sumArr[i] = sumArr[i − 1] + arr[i]; if (startIndex[arr[i]] == 0) startIndex[arr[i]] = i; endIndex[arr[i]] = i; } int maxSum = 0; for (int i = 0; i < n; i++) { int left = startIndex[arr[i]]; int right = endIndex[arr[i]]; maxSum = max(maxSum, sumArr[right] − sumArr[left − 1]); } return maxSum; } int main() { int arr[] = { 2, 1, 3, 5, 6, 2, 4, 3 }; int n = sizeof(arr) / sizeof(arr[0]); cout<<"起始和结束值相同的最大总和子数组为 "<<maxValue(arr, n); return 0; }
输出结果
起始和结束值相同的最大总和子数组为 23