이 문제에서는 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 =−10001단계 -
루프 i −> 0 ~ n−31.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입니다.