ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ของจำนวนเต็มและตัวเลข k งานของเราคือสร้างโปรแกรมเพื่อค้นหาผลคูณสูงสุดของลำดับย่อยของขนาด k ใน C ++
คำอธิบายปัญหา − ในที่นี้ เราต้องหาลำดับย่อยของขนาด k, 1<=k <=n ซึ่งมีผลคูณสูงสุดขององค์ประกอบ
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
arr[] = {1, 5, 6, -2, 0, 4} , k = 3
ผลลัพธ์
120
คำอธิบาย
ลำดับรองของขนาด 3 ที่มีผลผลิตสูงสุดคือ (5, 6, 4) สินค้าราคา 120.
แนวทางการแก้ปัญหา
ในการแก้ปัญหานี้ ก่อนอื่นเราจะเรียงลำดับอาร์เรย์ arr[] จากนั้นอิงตามองค์ประกอบของ arr[] และค่าของ k วิธีการเปลี่ยนในกรณีต่อไปนี้ -
กรณีที่ 1 (ถ้า k เป็นคู่) − ผลิตภัณฑ์สามารถมีค่า k สูงสุดได้ทั้งหมด ยกเว้น 0 ในที่นี้ เราต้องพิจารณาคู่ค่าลบด้วย เนื่องจากขนาดของมันยังสามารถให้ผลลัพธ์สูงสุดได้อีกด้วย
กรณีที่ 2 (ถ้า k เป็นเลขคี่) − นี่เป็นเงื่อนไขที่ซับซ้อนเล็กน้อย และค่ากำหนดวิธีการคำนวณผลลัพธ์ที่ต้องการ กรณีนี้จำเป็นต้องจัดประเภทเพิ่มเติมตามองค์ประกอบสูงสุดของอาร์เรย์
กรณีที่ 2.1 (ถ้าจำนวนสูงสุดเป็นบวก) − นี่หมายความว่าอาร์เรย์ประกอบด้วยจำนวนบวกและลบผสมกัน ในกรณีนี้ เราจะค้นหาองค์ประกอบ max k และค้นหาคู่สูงสุดจากด้านลบด้วย (หากเป็นไปได้ อาจให้ผลลัพธ์)
กรณีที่ 2.2 (ถ้าจำนวนสูงสุดเป็นศูนย์) − นี่หมายความว่าอาร์เรย์ประกอบด้วยองค์ประกอบเชิงลบทั้งหมดและเป็นศูนย์ ในกรณีนี้ ผลลัพธ์สูงสุดจะเป็น 0 เนื่องจากการคูณองค์ประกอบลบจำนวนคี่จะส่งผลให้เป็นจำนวนลบ ซึ่งหมายความว่า 0 คือผลคูณสูงสุด
กรณีที่ 2.3 (หากจำนวนสูงสุดเป็นค่าลบ) − นี่หมายความว่าอาร์เรย์ประกอบด้วยตัวเลขติดลบเท่านั้น ในกรณีนี้ ผลลัพธ์สูงสุดจะได้รับจากการคูณองค์ประกอบที่มีขนาดต่ำสุด เช่น อาร์เรย์สูงสุดจะช่วยได้
ด้วยวิธีนี้ เราต้องคอยตรวจสอบค่าขององค์ประกอบตลอดจน k เพื่อผลลัพธ์ที่ดีที่สุด สำหรับสิ่งนี้ เราจะเก็บค่า max และ min ทั้งสองข้างเป็น inarray เพื่อตรวจสอบว่าผลลัพธ์สามารถหาได้จากการคูณคู่ลบกับผลลัพธ์หรือไม่
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int findMaxSubArrayProduct(int arr[], int n, int k) { sort(arr, arr + n); int maxProd = 1; int i = 0, j = 0; int maxprod, minprod; if (arr[n - 1] == 0 && (k % 2 == 1)) return 0; if (arr[n - 1] <= 0 && (k % 2 == 1)) { for (i = n - 1; i >= n - k; i--) maxProd *= arr[i]; return maxProd; } i = 0; j = n - 1; if (k % 2 == 1) { maxProd *= arr[j]; j--; k--; } k = k/2; int it = 0; while(it < k){ int minprod = arr[i] * arr[i + 1]; int maxprod = arr[j] * arr[j - 1]; if (minprod > maxprod) { maxProd *= minprod; i += 2; } else { maxProd *= maxprod; j -= 2; } it++; } return maxProd; } int main() { int arr[] = { 1, 5, 6, -2, 0, 4 }; int n = sizeof(arr) / sizeof(arr[0]); int k = 3; cout<<"The maximum product of subsequence of size "<<k<<" is "<<findMaxSubArrayProduct(arr, n, k); return 0; }
ผลลัพธ์
The maximum product of subsequence of size 3 is 120