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

C++ 프로그램에서 크기 3의 증가하는 부분 수열의 최대 곱

<시간/>

이 문제에서는 n개의 양의 정수로 구성된 배열 arr[]이 제공됩니다. 우리의 임무는 크기가 3인 증가하는 부분 수열의 최대 곱을 찾는 프로그램을 만드는 것입니다.

문제 설명 − 여기에서 증가하는 부분 시퀀스를 형성하고 배열 인덱스도 증가하도록 배열의 3개 요소의 최대 곱을 찾아야 합니다. 즉

arr[i]*arr[j]*arr[k]는 최대값이고,arr[i] 

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

입력

arr ={5, 9, 2, 11, 4, 7}

출력

495

설명

조건을 만족하는 크기 3의 모든 부분배열은 (5, 9, 11), prod =5*9*11 =495(2, 4, 7), prod =2*4*7 =56Maximum =495입니다. 

솔루션 접근 방식

문제를 해결하는 간단한 방법은 배열을 반복하고 주어진 조건을 만족하는 3의 모든 하위 배열을 찾는 것입니다.

요소의 곱을 찾고 모든 제품의 최대값을 반환합니다.

알고리즘

초기화 -

maxProd =−1000

1단계 -

루프 i −> 0 ~ n−3

1.1단계 -

루프 j −> i에서 n−2로

1.1.1단계 -

if(arr[i] 루프 k −> j에서 n−1로

1.1.1.1단계 -

if(arr[j]  prod =arr[i]*arr[j]*arr[k]를 찾습니다.

1.1.1.2단계 -

if(maxProd> prod) −> maxProd =prod.

2단계 -

maxProd를 반환합니다.

예시

우리 솔루션의 작동을 설명하는 프로그램

#include 네임스페이스 std;int calcMaxProd(int arr[], int n){ int maxProd =−1000; int prod; for (int i =0; i  

출력

크기 3의 증가하는 부분 수열의 최대 곱은 495입니다.

이 솔루션은 쉽지만 O(n3) 차수의 시간 복잡도를 만드는 3개의 중첩 루프를 사용합니다. 따라서 문제에 대한 효율적인 솔루션을 살펴보겠습니다.

이 솔루션에서는 배열의 요소를 인덱스 1에서 n−2까지 가져옵니다. 그리고 그것을 3개 요소 하위 배열의 중간 요소로 취급합니다. 그런 다음 배열에서 나머지 두 요소를 찾습니다.

인덱스가 i보다 작은 배열의 arr[i]보다 작은 요소. 인덱스가 i보다 큰 배열의 aar[i]보다 큰 요소.

가장 작은 요소는 자체 균형 이진 검색 트리를 사용하여 찾고 가장 큰 요소는 오른쪽에서 왼쪽으로 탐색하고 오른쪽에서 최대 요소를 찾습니다.

두 값을 모두 찾은 후 요소 하위 배열의 prod를 찾은 다음 모두를 비교하여 maxProd를 찾습니다.

예시

우리 솔루션의 작동을 설명하는 프로그램

#include네임스페이스 std;long calMaxSubSeqProd(int arr[] , int n) { int smallLeftEle[n]; smallLeftEle[0] =-1; 설정작게; for (int i =0; i =1; i−−) { if (arr[i]> betterRightEle) GreaterRightEle =arr[i]; else if (smallerLeftEle[i] !=-1){ prod =smallLeftEle[i]*arr[i]*greaterRightEle; if(prod> maxProd) maxProd =prod; } } return maxProd;}int main() { int arr[] ={5, 9, 2, 11, 4, 7}; 정수 n =sizeof(arr)/sizeof(arr[0]); cout<<"크기 3의 증가하는 부분수열의 최대 곱은 "< 

출력

크기 3의 증가하는 부분 수열의 최대 곱은 495입니다.