C ++程序数组中三元组(大小为3的子序列)的最大乘积。

在这个问题中,我们得到了一个由n个整数组成的数组arr []。我们的任务是找到数组中三元组(大小为3的子序列)的最大乘积。在这里,我们将找到具有最大产品价值的三元组,然后退还产品。

让我们举个例子来了解这个问题,

输入项

arr[] = {9, 5, 2, 11, 7, 4}

输出结果

693

说明

在这里,我们将找到三元组,该三元组给出了数组所有元素的最大乘积。maxProd = 9 * 11 * 7 = 693

解决方法

该问题可以有多种解决方案。我们将在这里讨论它们,

方法1

直接方法在此方法中,我们将直接遍历数组,然后查找所有可能的三元组。查找每个三元组元素的乘积,然后返回所有元素的最大值。

算法

初始化

maxProd = −1000

第一步:

Create three nested loops:

Loop 1:i −> 0 to n−3

Loop 2: j −> i to n−2

Loop 3: k −> j to n−1

步骤1.1 -

Find the product, prod = arr[i]*arr[j]*arr[k].

步骤1.2 -

if prod > maxProd −> maxProd = prod.

第3步-

return maxProd.

示例

显示我们解决方案实施情况的程序

#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<<"数组中三元组的最大乘积为 "<<calcMaxProd(arr, n);

   return 0;

}

输出结果

数组中三元组的最大乘积为 693

方法二

使用排序

在此方法中,我们将按降序对数组进行排序。在排序数组中,最大三元乘积将为

(arr[0], arr[1], arr[2])

(arr[0], arr[1], arr[2])

我们将退还这些三胞胎产品的最大值。

算法

第1步-

Sort the given array in descending order.

第2步-

Find product of triples,

maxTriplet1 = arr[0]*arr[1]*arr[2]

maxTriplet2 = arr[0]*arr[n−1]*arr[n−2]

第3步-

if( maxTriplet1 > maxTriplet2 ) −> return maxTriplet1

第4步-

else −> return maxTriplet2.

示例

该程序说明了我们解决方案的工作原理,

#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<<"数组中三元组的最大乘积为

   "<<calcMaxProd(arr, n);

   return 0;

}

输出结果

三元组数组的最大乘积为693

方法3

查找三元组值。

现在我们知道最大的三元组可以来自两个三元组中的一个

(maximum, second_max, third_max)

(maximum, minimum, second_min)

因此,我们可以通过遍历数组直接找到这些值,然后使用这些值,我们将找到最大乘积三元组。

算法

初始化

最大值= -1000,秒最大值= -1000,第三最大值= -1000,最小值= 10000,秒最小值= 10000

第1步-

loop the array i −> 0 to n−1.

步骤1.1

if(arr[i] > max) −> thirdMax = secMax, secMax = max, max

= arr[i]

步骤1.2 -

elseif(arr[i] > secMax) −> thirdMax = secMax, secMax =

arr[i]

步骤1.3 -

elseif(arr[i] > thirdMax) −> thirdMax = arr[i]

步骤1.4 -

if(arr[i] < min) −> secMin = min, min = arr[i]

步骤1.4 -

elseif(arr[i] < secMin) −> secMin = arr[i]

第2步-

triplet1 = max * secMax * thridMax

triplet2 = max * min * secMin

第3步-

if(triplet1 > triplet2) −> return triplet1

第4步-

else −> return triplet2

示例

该程序说明了我们解决方案的工作原理,

#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<<"数组中三元组的最大乘积为

   "<<calcMaxProd(arr, n);

   return 0;

}

输出结果

数组中三元组的最大乘积为 693

以上是 C ++程序数组中三元组(大小为3的子序列)的最大乘积。 的全部内容, 来源链接: utcz.com/z/321480.html

回到顶部