C++中的最大和最小乘積子集


給定一個大小為N的整數陣列。這裡的目標是找到最大和最小乘積子集。我們將透過使用兩個乘積變數來實現這一點,一個用於迄今為止找到的最小乘積`minProd`,另一個用於迄今為止找到的最大乘積`maxProd`。

在遍歷陣列時,我們將每個元素分別與`minProd`和`maxProd`相乘。還要檢查之前的最大乘積、之前的最小乘積、當前最大乘積、當前最小乘積以及當前元素本身。

輸入

Arr[]= { 1,2,5,0,2 }

輸出

Maximum Product: 20
Minimum Product: 0

解釋 − 從陣列中的第二個元素開始,`maxProd`和`minProd`的值初始化為1(第一個元素)。

Arr[1]: 1*2=2, 1*2=2, maxProd=2, minProd=1
Arr[2]: 2*5=10, 1*5=5, maxProd=10, minProd=1
Arr[3]: 10*0=0, 1*0=0, maxProd=10, minProd=0
Arr[4]: 10*2=20, 0*2=0, maxProd=20, minProd=0

輸入

Arr[]= { -1,2,-5,0,2 }

輸出

Maximum Product: 20
Minimum Product: -20

解釋 − 對於最大乘積,子集的元素為{-1, 2, -5, 2}

對於最小乘積,子集的元素為{2, -5, 2}

下面程式中使用的方法如下

  • 整數陣列`Arr[]`包含正整數和負整數。

  • 變數`size`包含陣列的長度。

  • 函式`getProductSubset(int arr[], int n)`以陣列作為輸入,並返回獲得的元素的最大和最小乘積。

  • 變數`curMin`、`curMax`用於儲存當前找到的最大和最小乘積。初始值為`arr[0]`。

  • 變數`prevMin`、`prevMax`用於儲存先前找到的最大和最小乘積。初始值為`arr[0]`。

  • 變數`maxProd`和`minProd`用於儲存最終獲得的最大和最小乘積。

  • 從第二個元素`arr[1]`開始遍歷陣列,直到最後一個索引。

  • 對於最大乘積,將當前`arr[i]`與`prevMax`和`prevMin`相乘。將最大乘積儲存在`curMax`中。如果`curMax > prevMax`,則用`prevMax`更新`curMax`。

  • 如果`curMax > maxProd`,則用`curMax`更新`maxProd`。

  • 最後,為下一次迭代將`prevMax`更新為`curMax`。

  • 透過更改比較,對`prevMin`、`curMin`和`minProd`執行與上述相同的步驟。

  • 迴圈結束後,列印`maxProd`和`minProd`中獲得的結果。

示例

 線上演示

#include <iostream>
using namespace std;
void getProductSubset(int arr[], int n){
   // Initialize all products with arr[0]
   int curMax = arr[0];
   int curMin = arr[0];
   int prevMax = arr[0];
   int prevMin= arr[0];
   int maxProd = arr[0];
   int minProd = arr[0];
   int temp1=0,temp2=0,temp3=0;
   // Process all elements after arr[0]
   for (int i = 1; i < n; ++i){
      /* Current maximum product is maximum of following
      1) prevMax * current arr[i] (when arr[i] is +ve)
      2) prevMin * current arr[i] (when arr[i] is -ve)
      3) current arr[i]
      4) Previous max product */
      temp1=prevMax*arr[i];
      temp2=prevMin*arr[i];
      temp3=temp1>temp2?temp1:temp2;
      curMax = temp3>arr[i]?temp3:arr[i];
      curMax = curMax>prevMax?curMax:prevMax;
      /* Current minimum product is minimum of following
      1) prevMin * current arr[i] (when arr[i] is +ve)
      2) prevMax * current arr[i] (when arr[i] is -ve)
      3) current arr[i]
      4) Previous min product */
      temp1=prevMax*arr[i];
      temp2=prevMin*arr[i];
      temp3=temp1<temp2?temp1:temp2;
      curMin = temp3<arr[i]?temp3:arr[i];
      curMin = curMin<prevMin?curMin:prevMin;
      maxProd = maxProd>curMax?maxProd:curMax;
      minProd = minProd<curMin?minProd:curMin;
      // copy current values to previous values
      prevMax = curMax;
      prevMin = curMin;
   }
   std::cout<<"Maximum Subset Product: "<<maxProd;
   std::cout<<"\nMinimum Subset Product: "<<minProd;
}
int main(){
   int Arr[] = {-4, -3, 1, 2, 0, 8, 1};
   // int arr[] = {-4, 1,1, 3, 5,7};
   int size = 7;
   getProductSubset(Arr,size ) ;
   return 0;
}

輸出

Maximum Subset Product: 192
Minimum Subset Product: -64

更新於:2020年7月28日

瀏覽量:288

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.