Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ชุดย่อยผลิตภัณฑ์สูงสุดของอาร์เรย์ในโปรแกรม C++


ในปัญหา เราได้รับอาร์เรย์ arr[] ของค่าจำนวนเต็ม n ค่า งานของเราคือสร้างโปรแกรมเพื่อค้นหาชุดย่อยผลิตภัณฑ์สูงสุดของอาร์เรย์

คำอธิบายปัญหา − ในที่นี้ เราต้องคำนวณผลคูณสูงสุดที่เป็นไปได้ของชุดย่อยขององค์ประกอบของอาร์เรย์

เซตย่อย − Array sub[] คือชุดย่อยของ array arr[] หากองค์ประกอบทั้งหมดของ sub[] มีอยู่ใน arr[]

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

อินพุต

arr[] = {4, 5, 2, −1, 3}

ผลลัพธ์

40

คำอธิบาย

Subset sub[] = {4, 5, 2}
Prod = 4*5*2 = 40

แนวทางการแก้ปัญหา

แนวทางที่ง่ายและสะดวกในการแก้ปัญหาคือการสร้างชุดย่อยที่เป็นไปได้ทั้งหมดของอาร์เรย์ ค้นหาผลิตภัณฑ์และคืนสินค้าสูงสุด

โซลูชันนี้ใช้งานง่าย แต่ต้องใช้การวนซ้ำซ้อนทำให้ความซับซ้อนของลำดับของ O(n 2 *น)

ลองใช้ที่นี่

วิธีแก้ปัญหาที่มีประสิทธิภาพ คือโดยการคำนวณจำนวนค่าลบ (nofNeg) และค่าศูนย์ (nof0) จากอาร์เรย์แล้วคำนวณ maxProd ตามเงื่อนไขเหล่านี้

กรณีที่ 1 (nof0 =0 และ nofNeg เป็นเลขคู่)− พิจารณาองค์ประกอบทั้งหมดของอาร์เรย์ไปยังผลิตภัณฑ์

maxProd =arr[0] * arr[1] * … arr[n−1]

กรณีที่ 2 (nof0 =0 และ nofNeg เป็นเลขคี่)− พิจารณาองค์ประกอบทั้งหมดของอาร์เรย์ ยกเว้นองค์ประกอบเชิงลบที่ใหญ่ที่สุดของอาร์เรย์ (ใกล้สุดถึง 0)

กรณีที่ 3 (nof0 !=0)− ปล่อยให้ศูนย์ทั้งหมดของอาร์เรย์สำหรับผลิตภัณฑ์ และเอาเคสที่คล้ายกับกรณีที่ 1 และ 2

กรณีพิเศษ - มีเพียงองค์ประกอบเดียวยกเว้น 0 ที่เป็นค่าลบ maxProd =0.

อัลกอริทึม

เริ่มต้น

maxProd = 1;

ขั้นตอนที่ 1

Loop the array and count, nof0(number of zeros) and
nofNeg(number of negatives), and find maxProd.
maxProd = maxProd*arr[i], i −> 0 to n−1

ขั้นตอนที่ 2

consider the following cases −
Case 1− if(nofNeg%2 == 0): maxProd
Case 2− if(nofNeg%2 != 0): maxProd = maxProd/(largestNeg)
Case 3 − if(nof0 == (n-1) and nofNeg == 1), maxProd = 0.

ขั้นตอนที่ 3

Print maxProd.

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <iostream>
using namespace std;
int findMaxSubsetProd(int arr[], int n){
   int larNeg = −1000;
   int nofNeg = 0, Nof0 = 0;
   int maxProd = 1;
   for (int i = 0; i < n; i++) {
      if (arr[i] == 0){
         Nof0++;
         continue;
      }
      else if (arr[i] < 0) {
         nofNeg++;
         if(larNeg < arr[i])
         larNeg = arr[i];
      }
      maxProd = maxProd * arr[i];
   }
   if(nofNeg%2 == 0){
      return maxProd;
   }
   else if(nofNeg%2 != 0)
      return (maxProd / larNeg);
   if(Nof0 == (n−1) and nofNeg == 1)
      return 0;
   return maxProd;
}
int main(){
   int arr[] = {4, −2, 5, −1, 3, −6};
   int n = sizeof(arr)/sizeof(arr[0]);
   cout<<"The maximum product subset of an array is "<<findMaxSubsetProd(arr, n);
   return 0;
}

ผลลัพธ์

The maximum product subset of an array is 720