ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ที่ประกอบด้วยจำนวนเต็ม n ตัว ภารกิจของเราคือหาผลคูณสูงสุดของทริปเปิล (ลำดับย่อยขนาด 3) ในอาร์เรย์ ที่นี่ เราจะหาทริปเปิลที่ให้ค่าผลคูณสูงสุดขององค์ประกอบทั้งหมดของอาร์เรย์ แล้วคืนค่าผลคูณ
ตัวอย่าง
อินพุต
arr[] = {9, 5, 2, 11, 7, 4}
เอาต์พุต
693
คำอธิบาย
ที่นี่ เราจะหาทริปเปิลที่ให้ผลคูณสูงสุดขององค์ประกอบทั้งหมดของอาร์เรย์ maxProd = 9 * 11 * 7 = 693
แนวทางแก้ปัญหา
สามารถมีหลายวิธีแก้ปัญหาได้ เราจะอภิปรายที่นี่
วิธีที่ 1: วิธีตรง (Brute Force)
ในวิธีนี้ เราจะวนลูปผ่านอาร์เรย์โดยตรงแล้วหาทริปเปิลที่เป็นไปได้ทั้งหมด หาผลคูณขององค์ประกอบแต่ละทริปเปิลและคืนค่าสูงสุดของทั้งหมด
อัลกอริทึม
เริ่มต้น
maxProd = -1000
ขั้นตอนที่ 1:
สร้าง 3 ลูปซ้อน:
Loop 1: i → 0 ถึง n-3
Loop 2: j → i ถึง n-2
Loop 3: k → j ถึง n-1
ขั้นตอนที่ 1.1
หาผลคูณ, prod = arr[i]*arr[j]*arr[k]
ขั้นตอนที่ 1.2
ถ้า prod > maxProd → maxProd = prod
ขั้นตอนที่ 3
คืนค่า maxProd
ตัวอย่างโค้ด (วิธีที่ 1)
โปรแกรมแสดงการใช้งานวิธีแก้ปัญหาของเรา
#include <iostream>
using namespace std;
int calcMaxProd(int arr[], int n){
int maxProd = -1000;
int prod;
for (int i = 0; i < n - 2; i++)
for (int j = i + 1; j < n - 1; j++)
for (int k = j + 1; k < n; k++){
prod = arr[i] * arr[j] * arr[k];
if(maxProd < prod)
maxProd = prod;
}
return maxProd;
}
int main(){
int arr[] = { 9, 5, 2, 11, 7, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Maximum product of a triplet in array is " << calcMaxProd(arr, n);
return 0;
}
เอาต์พุต
Maximum product of a triplet in array is 693
วิธีที่ 2: ใช้การเรียงลำดับ (Sorting)
ในวิธีนี้ เราจะเรียงอาร์เรย์ตามลำดับจากมากไปน้อย ในอาร์เรย์ที่เรียงแล้ว ทริปเปิลผลคูณสูงสุดจะอยู่ที่
(arr[0], arr[1], arr[2])
(arr[0], arr[n-1], arr[n-2])
เราจะคืนค่าสูงสุดของผลคูณของทริปเปิลเหล่านี้
อัลกอริทึม
ขั้นตอนที่ 1
เรียงอาร์เรย์ที่กำหนดตามลำดับจากมากไปน้อย
ขั้นตอนที่ 2
หาผลคูณของทริปเปิล
maxTriplet1 = arr[0]*arr[1]*arr[2]
maxTriplet2 = arr[0]*arr[n-1]*arr[n-2]
ขั้นตอนที่ 3
ถ้า (maxTriplet1 > maxTriplet2) → คืนค่า maxTriplet1
ขั้นตอนที่ 4
มิฉะนั้น → คืนค่า maxTriplet2
ตัวอย่างโค้ด (วิธีที่ 2)
โปรแกรมสำหรับแสดงการทำงานของวิธีแก้ปัญหาของเรา
#include <bits/stdc++.h>
using namespace std;
int calcMaxProd(int arr[], int n){
sort(arr, arr + n, greater<>());
int maxTriplet1 = arr[0]*arr[1]*arr[2];
int maxTriplet2 = arr[0]*arr[n-1]*arr[n-2];
if(maxTriplet1 > maxTriplet2)
return maxTriplet1;
return maxTriplet2;
}
int main(){
int arr[] = { 9, 5, 2, 11, 7, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Maximum product of a triplet in array is " << calcMaxProd(arr, n);
return 0;
}
เอาต์พุต
Maximum product of a triplet in array is 693
วิธีที่ 3: หาค่าทริปเปิลโดยตรง
เนื่องจากเราทราบแล้วว่าทริปเปิลผลคูณสูงสุดสามารถมาจากทริปเปิลใดทริปเปิลหนึ่งของสองทริปเปิลนี้
(สูงสุด, สองมากสุด, สามมากสุด)
(สูงสุด, ต่ำสุด, สองต่ำสุด)
ดังนั้น เราสามารถหาค่าเหล่านี้โดยตรงโดยการเดินทางผ่านอาร์เรย์ และใช้ค่าเหล่านี้เพื่อหาทริปเปิลผลคูณสูงสุด
อัลกอริทึม
เริ่มต้น
max = -1000, secMax = -1000, thirdMax = -1000, min = 10000, secMin = 10000
ขั้นตอนที่ 1
วนลูปอาร์เรย์ i → 0 ถึง n-1
ขั้นตอนที่ 1.1
ถ้า (arr[i] > max) → thirdMax = secMax, secMax = max, max = arr[i]
ขั้นตอนที่ 1.2
ถ้า (arr[i] > secMax) → thirdMax = secMax, secMax = arr[i]
ขั้นตอนที่ 1.3
ถ้า (arr[i] > thirdMax) → thirdMax = arr[i]
ขั้นตอนที่ 1.4
ถ้า (arr[i] < min) → secMin = min, min = arr[i]
ขั้นตอนที่ 1.5
ถ้า (arr[i] < secMin) → secMin = arr[i]
ขั้นตอนที่ 2
triplet1 = max * secMax * thirdMax
triplet2 = max * min * secMin
ขั้นตอนที่ 3
ถ้า (triplet1 > triplet2) → คืนค่า triplet1
ขั้นตอนที่ 4
มิฉะนั้น → คืนค่า triplet2
ตัวอย่างโค้ด (วิธีที่ 3)
โปรแกรมสำหรับแสดงการทำงานของวิธีแก้ปัญหาของเรา
#include <iostream>
using namespace std;
int calcMaxProd(int arr[], int n){
int max = -1000, secMax = -1000, thirdMax = -1000;
int min = 1000, secMin = 1000;
for (int i = 0; i < n; i++){
if (arr[i] > max){
thirdMax = secMax;
secMax = max;
max = arr[i];
}
else if (arr[i] > secMax){
thirdMax = secMax;
secMax = arr[i];
}
else if (arr[i] > thirdMax)
thirdMax = arr[i];
if (arr[i] < min){
secMin = min;
min = arr[i];
}
else if(arr[i] < secMin)
secMin = arr[i];
}
int triplet1 = max * secMax * thirdMax;
int triplet2 = max * secMin * min;
if(triplet1 > triplet2)
return triplet1;
return triplet2;
}
int main(){
int arr[] = { 9, 5, 2, 11, 7, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Maximum product of a triplet in array is " << calcMaxProd(arr, n);
return 0;
}
เอาต์พุต
Maximum product of a triplet in array is 693