ในปัญหานี้ เราได้รับอาร์เรย์ของจำนวนเต็ม (บวกและลบ) งานของเราคือสร้างโปรแกรมเพื่อคำนวณ Maximum ProductSubarray ใน C++
วิธีแก้ไขปัญหา − ในที่นี้ เรามีอาร์เรย์ที่มีตัวเลขบวก ลบ และศูนย์ เราจำเป็นต้องค้นหาผลคูณของอาร์เรย์ย่อยที่สร้างโดยองค์ประกอบของอาร์เรย์ และเพิ่มผลผลิตของอาร์เรย์ย่อยให้สูงสุด
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
arr[] = {-1, 2, -7, -5, 12, 6} ผลลัพธ์
5040
คำอธิบาย
อาร์เรย์ย่อยที่มีผลิตภัณฑ์สูงสุดคือ {2, -7, -5, 12, 6}
Product = 5040
แนวทางการแก้ปัญหา
เพื่อแก้ปัญหานี้ เราได้รับอาร์เรย์และผลิตภัณฑ์สูงสุดของอาร์เรย์ย่อยและจัดการ maxVal ซึ่งเป็นผลิตภัณฑ์สูงสุดไม่เกินองค์ประกอบปัจจุบัน และ minVal คือค่าสูงสุดเชิงลบของผลิตภัณฑ์ จากนั้นตามค่าปัจจุบัน maxVal และ minVal จะได้รับการอัปเดตเป็น −
กรณีที่ 1 - องค์ประกอบเป็นบวก - อัปเดต maxVal และ minVal โดยการคูณอาร์เรย์
กรณีที่ 2 - องค์ประกอบเป็นศูนย์ − แบ่งอาร์เรย์ย่อยปัจจุบันด้วยการคูณด้วย 0 จะส่งผลให้เป็น 0
กรณีที่ 3 - องค์ประกอบเป็นลบ - อัปเดตทั้งสองค่าด้วยค่าลบที่ทำให้สูงสุด
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream>
using namespace std;
int min(int a, int b){
if(a < b)
return a;
return b;
}
int max(int a, int b){
if(a > b)
return a;
return b;
}
int CalcMaxProductSubArray(int arr[], int n) {
int i = 0;
int maxVal = -1000;
int localMax = 1;
int localMin = 1;
int lastMax;
while(i < n) {
int currentVal = arr[i];
if (currentVal > 0) {
localMax = (localMax * currentVal);
localMin = min(1, localMin * currentVal);
}
else if (currentVal < 0) {
lastMax = localMax;
localMax = (localMin * currentVal);
localMin = (lastMax * currentVal);
} else {
localMin = 1;
localMax = 0;
}
maxVal = max(maxVal, localMax);
if (localMax <= 0)
localMax = 1;
i++;
}
return maxVal;
}
int main(){
int arr[] = { -1, 2, -7, -5, 12, 6 };
int n = 6;
cout<<"The maximum product Subarray is "<<CalcMaxProductSubArray(arr, n);
return 0;
} ผลลัพธ์
The maximum product Subarray is 5040