Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++ 프로그램에서 특정 요소를 제외한 최대 하위 배열 합계


이 문제에서 크기가 n인 두 개의 배열 arr1[]과 크기가 m인 arr2[]가 주어졌습니다. 우리의 임무는 특정 요소를 제외한 최대 하위 배열 합계를 찾는 프로그램을 만드는 것입니다.

문제 설명 − arr2[]에 없는 배열 arr1[]의 요소에서 최대 하위 배열 합계를 찾아야 합니다.

문제를 이해하기 위해 예를 들어보겠습니다.

입력

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