📜  流中最大的三重产物

📅  最后修改于: 2021-10-28 01:52:32             🧑  作者: Mango

给定一个整数流,表示为 arr[]。对于从 0 到 n-1 的每个索引 i,打印子数组 arr[0…i] 的最大、第二大、第三大元素的乘法。如果 i < 2 打印 -1。

例子:

Input : arr[] = {1, 2, 3, 4, 5}
Output :-1
        -1
         6
         24
         60
Explanation : for i = 2 only three elements 
are there {1, 2, 3} so answer is 6. For i = 3
largest three elements are {2, 3, 4} their
product is 2*3*4 = 24 ....so on            

我们将在这里使用优先队列。

  1. 在优先级队列中插入 arr[i]
  2. 由于优先级队列中的顶部元素最大,因此将其弹出并存储为 x。现在优先级队列中的顶部元素将是子数组 arr[0…i] 中的第二大元素,将其弹出并存储为 y。现在顶部元素是子数组 arr[0…i] 中的第三大元素,因此弹出它并将其存储为 z。
  3. 打印 x*y*z
  4. 重新插入 x、y、z。
C++
// C++ implementation of largest triplet
// multiplication
#include 
using namespace std;
 
// Prints the product of three largest numbers
// in subarray arr[0..i]
void LargestTripletMultiplication(int arr[], int n)
{
    // call a priority queue
    priority_queue q;
 
    // traversing the array
    for (int i = 0; i < n; i++) {
        // pushing arr[i] in the array
        q.push(arr[i]);
 
        // if less than three elements are present
        // in array print -1
        if (q.size() < 3)
            cout << "-1" << endl;
        else {
            // pop three largest elements
            int x = q.top();
            q.pop();
            int y = q.top();
            q.pop();
            int z = q.top();
            q.pop();
 
            // Reinsert x, y, z in priority_queue
            int ans = x * y * z;
            cout << ans << endl;
            q.push(x);
            q.push(y);
            q.push(z);
        }
    }
    return;
}
 
// Driver Function
int main()
{
    int arr[] = { 1, 2, 3, 4, 5 };
    int n = sizeof(arr) / sizeof(arr[0]);
    LargestTripletMultiplication(arr, n);
    return 0;
}


Java
// Java implementation of largest triplet
// multiplication
import java.util.Collections;
import java.util.PriorityQueue;
 
class GFG {
 
    // Prints the product of three largest numbers
    // in subarray arr[0..i]
    static void LargestTripletMultiplication(int arr[], int n)
    {
        // call a priority queue
        PriorityQueue q = new PriorityQueue(Collections.reverseOrder());
 
        // traversing the array
        for (int i = 0; i < n; i++) {
            // pushing arr[i] in array
            q.add(arr[i]);
 
            // if less than three elements are present
            // in array print -1
            if (q.size() < 3)
                System.out.println("-1");
            else {
                // pop three largest elements
                int x = q.poll();
                int y = q.poll();
                int z = q.poll();
 
                // Reinsert x, y, z in priority_queue
                int ans = x * y * z;
                System.out.println(ans);
                q.add(x);
                q.add(y);
                q.add(z);
            }
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = { 1, 2, 3, 4, 5 };
        int n = arr.length;
        LargestTripletMultiplication(arr, n);
    }
}
 
// This code is contributed by shubham96301


Python3
# Python3 implementation of largest triplet
# multiplication
from queue import PriorityQueue
 
# Prints the product of three largest
# numbers in subarray arr[0..i]
def LargestTripletMultiplication(arr, n):
     
    # Call a priority queue
    q = PriorityQueue()
 
    # Traversing the array
    for i in range(n):
         
        # Pushing -arr[i] in array
        # to get max PriorityQueue
        q.put(-arr[i])
 
        # If less than three elements
        # are present in array print -1
        if (q.qsize() < 3):
            print(-1)
        else:
             
            # pop three largest elements
            x = q.get()
            y = q.get()
            z = q.get()
 
            # Reinsert x, y, z in
            # priority_queue
            ans = x * y * z
             
            print(-ans)
             
            q.put(x);
            q.put(y);
            q.put(z);
 
# Driver Code
if __name__ == '__main__':
  
    arr = [ 1, 2, 3, 4, 5 ]
    n = len(arr)
     
    LargestTripletMultiplication(arr, n)
     
# This code is contributed by math_lover


C#
// C# implementation of largest triplet
// multiplication
using System;
using System.Collections.Generic;
public class GFG {
 
  // Prints the product of three largest numbers
  // in subarray arr[0..i]
  static void LargestTripletMultiplication(int []arr, int n)
  {
    // call a priority queue
    List q = new List();
 
    // traversing the array
    for (int i = 0; i < n; i++)
    {
 
      // pushing arr[i] in array
      q.Add(arr[i]);
      q.Sort();
      q.Reverse();
 
      // if less than three elements are present
      // in array print -1
      if (q.Count < 3)
        Console.WriteLine("-1");
      else
      {
 
        // pop three largest elements
        int x = q[0];
        int y = q[1];
        int z = q[2];
        q.RemoveRange(0, 3);
 
        // Reinsert x, y, z in priority_queue
        int ans = x * y * z;
        Console.WriteLine(ans);
        q.Add(x);
        q.Add(y);
        q.Add(z);
      }
    }
  }
 
  // Driver code
  public static void Main(String[] args)
  {
    int []arr = { 1, 2, 3, 4, 5 };
    int n = arr.Length;
    LargestTripletMultiplication(arr, n);
  }
}
 
 
// This code is contributed by Rajput-Ji


Javascript


输出:

-1
-1
6
24
60

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程