Find maximum product of a triplet in array - GeeksforGeeks
Given an integer array, find a maximum product of a triplet in array.
Approach 1 (Naive, O(n3) time, O(1) Space)
Given an integer array, find a maximum product of a triplet in array.
- Scan the array and compute Maximum, second maximum and third maximum element present in the array.
- Scan the array and compute Minimum and second minimum element present in the array.
- Return the maximum of product of Maximum, second maximum and third maximum and product of Minimum, second minimum and Maximum element.
Approach 4: O(n) Time, O(1) Space
int maxProduct(int arr[], int n){ // if size is less than 3, no triplet exists if (n < 3) return -1; // Initialize Maximum, second maximum and third // maximum element int maxA = INT_MIN, maxB = INT_MIN, maxC = INT_MIN; // Initialize Minimum and second mimimum element int minA = INT_MAX, minB = INT_MAX; for (int i = 0; i < n; i++) { // Update Maximum, second maximum and third // maximum element if (arr[i] > maxA) { maxC = maxB; maxB = maxA; maxA = arr[i]; } // Update second maximum and third maximum element else if (arr[i] > maxB) { maxC = maxB; maxB = arr[i]; } // Update third maximum element else if (arr[i] > maxC) maxC = arr[i]; // Update Minimum and second mimimum element if (arr[i] < minA) { minB = minA; minA = arr[i]; } // Update second mimimum element else if(arr[i] < minB) minB = arr[i]; } return max(minA * minB * maxA, maxA * maxB * maxC);}
Approach 2: O(n) Time, O(n) Space
- Construct four auxiliary arrays leftMax[], rightMax[], leftMin[] and rightMin[] of same size as input array.
- Fill leftMax[], rightMax[], leftMin[] and rightMin[] in below manner.
- leftMax[i] will contain maximum element on left of arr[i] excluding arr[i]. For index 0, left will contain -1.
- leftMin[i] will contain minimum element on left of arr[i] excluding arr[i]. For index 0, left will contain -1.
- rightMax[i] will contain maximum element on right of arr[i] excluding arr[i]. For index n-1, right will contain -1.
- rightMin[i] will contain minimum element on right of arr[i] excluding arr[i]. For index n-1, right will contain -1.
- For all array indexes i except first and last index, compute maximum of arr[i]*x*y where x can be leftMax[i] or leftMin[i] and y can be rightMax[i] or rightMin[i].
- Return the maximum from step 3.
int maxProduct(int arr[], int n){ // if size is less than 3, no triplet exists if (n < 3) return -1; // Construct four auxiliary vectors // of size n and initailize them by -1 vector<int> leftMin(n, -1); vector<int> rightMin(n, -1); vector<int> leftMax(n, -1); vector<int> rightMax(n, -1); // will contain max product int max_product = INT_MIN; // to store maximum element on left of array int max_sum = arr[0]; // to store minimum element on left of array int min_sum = arr[0]; // leftMax[i] will contain max element // on left of arr[i] excluding arr[i]. // leftMin[i] will contain min element // on left of arr[i] excluding arr[i]. for (int i = 1; i < n; i++) { leftMax[i] = max_sum; if (arr[i] > max_sum) max_sum = arr[i]; leftMin[i] = min_sum; if (arr[i] < min_sum) min_sum = arr[i]; } // reset max_sum to store maximum element on // right of array max_sum = arr[n - 1]; // reset min_sum to store minimum element on // right of array min_sum = arr[n - 1]; // rightMax[i] will contain max element // on right of arr[i] excluding arr[i]. // rightMin[i] will contain min element // on right of arr[i] excluding arr[i]. for (int j = n - 2; j >= 0; j--) { rightMax[j] = max_sum; if (arr[j] > max_sum) max_sum = arr[j]; rightMin[j] = min_sum; if (arr[j] < min_sum) min_sum = arr[j]; } // For all array indexes i except first and // last, compute maximum of arr[i]*x*y where // x can be leftMax[i] or leftMin[i] and // y can be rightMax[i] or rightMin[i]. for (int i = 1; i < n - 1; i++) { int max1 = max(arr[i] * leftMax[i] * rightMax[i], arr[i] * leftMin[i] * rightMin[i]); int max2 = max(arr[i] * leftMax[i] * rightMin[i], arr[i] * leftMin[i] * rightMax[i]); max_product = max(max_product, max(max1, max2)); } return max_product;}
Approach 3: O(nlogn) Time, O(1) Space
- Sort the array using some efficient in-place sorting algorithm in ascending order.
- Return the maximum of product of last three elements of the array and product of first two elements and last element.
int maxProduct(int arr[], int n){ // if size is less than 3, no triplet exists if (n < 3) return -1; // Sort the array in ascending order sort(arr, arr + n); // Return the maximum of product of last three // elements and product of first two elements // and last element return max(arr[0] * arr[1] * arr[n - 1], arr[n - 1] * arr[n - 2] * arr[n - 3]);}Approach 1 (Naive, O(n3) time, O(1) Space)
1. Print the triplet that has maximum product.
2. Find a minimum product of a triplet in array.