配列LeetcodeソリューションのXNUMXつの要素の最大積


難易度 簡単に
よく聞かれる サムスン
配列

「配列内のXNUMXつの要素の最大積」の問題では、XNUMXつのインデックスを見つけることが目標です。 i j 与えられた整数の配列で a、積(a [i] – 1)*(a [j] – 1)が最大になるようにします。 配列には少なくとも2つの要素があり、すべての要素が正です。 必要な積が整数の範囲に収まるという問題。 最適化するには、(a [i] – 1)*(a [j] – 1)の値を出力する必要があります i & j.

a = {1 , 4 , 5 , 3 , 6 , 4}
2

説明

明らかに、6と5が最大で、1番目に大きい数値です。 したがって、product =(a [i] – 1)*(a [j] – 20)= XNUMXです。

アプローチ(ソート)

製品: (a [i] – 1)*(a [j] – 1) a [i]とa [j]が配列内のXNUMXつの最大要素である場合に最大になります。 XNUMXつの最大要素を含むXNUMXつのインデックスiとjを見つける代わりに、次のことができます。 sort 配列 昇順で。 これにより、XNUMXつの最大の要素が最後にあることが確認されます。 したがって、製品 (a [n – 1] – 1)*(a [n – 2] – 1) 必要な結果になります。

アルゴリズム

  1. 配列を並べ替える
  2. 結果を出力します:(a [n – 1] – 1)*(a [n – 2] – 1)

配列内のXNUMXつの要素の最大積を見つけるためのアルゴリズムの実装

C ++プログラム

#include <bits/stdc++.h>
using namespace std;

int maxProduct(vector <int> &a)
{
    int n = a.size();
    sort(a.begin() , a.end());
    return ((a[n - 1] - 1) * (a[n - 2] - 1));
}


int main()
{
    vector <int> a = {1 , 4 , 5 , 3 , 6 , 4};
    cout << maxProduct(a) << '\n';
}

Javaプログラム

import java.util.Arrays;

class maximum_product
{
    public static void main(String args[])
    {
        int[] a = {1 , 4 , 5 , 3 , 6 , 4};
        System.out.println(maxProduct(a));
    }

    static int maxProduct(int[] a)
    {
        int n = a.length;
        Arrays.sort(a);
        return (a[n - 1] - 1) * (a[n - 2] - 1);
    }
}
20

配列内のXNUMXつの要素の最大積を見つける複雑さの分析

時間の複雑さ

O(NlogN)、N =配列のサイズ。 O(NlogN)時間かかる配列をソートします。

スペースの複雑さ

O(1)、一定のメモリスペースを使用するため。

アプローチ(最適)

上で説明したように、配列内のXNUMXつの最大要素を見つける必要があります。 配列全体をソートすることにより、 やり過ぎ 必要な作業。 したがって、単純な比較操作によって、配列内のXNUMX番目とXNUMX番目に大きい要素を見つけることが最適です。 したがって、必要な結果は次のように取得できます。 (firstMax – 1)*(secondMax – 1).

配列LeetcodeソリューションのXNUMXつの要素の最大積

アルゴリズム

  1. XNUMXつの変数を初期化します:firstMaxとsecondMaxをゼロとして(配列内の任意の値がそれらを最初に更新するように)。
  2. 配列の最初から最後までループを実行します。
  3. すべての要素について:
    • firstMaxより大きいかどうかを確認します。
      • 真であれば:
        • secondMax = firstMaxに設定します
        • firstMax = current-elementを更新します
      • その他:
        • それがsecondMaxより大きい場合
          • secondMax = current-elementを更新します
  4. 結果を印刷する

配列LeetcodeソリューションでXNUMXつの要素の最大積を見つけるためのアルゴリズムの実装

C ++プログラム

#include <bits/stdc++.h>
using namespace std;

int maxProduct(vector <int> &a)
{
    int firstMax = 0 , secondMax = 0 , n = a.size();
    for(int i = 0 ; i < n ; i++)
        if(a[i] > firstMax)
        {
            secondMax = firstMax;
            firstMax = a[i];
        }
        else if(a[i] > secondMax)
            secondMax = a[i];

    return (firstMax - 1) * (secondMax - 1);
}

int main()
{
    vector <int> a = {1 , 4 , 5 , 3 , 6 , 4};
    cout << maxProduct(a) << '\n';
}

Javaプログラム

class maximum_product
{
    public static void main(String args[])
    {
        int[] a = {1 , 4 , 5 , 3 , 6 , 4};
        System.out.println(maxProduct(a));
    }

    static int maxProduct(int[] a)
    {
        int firstMax = 0 , secondMax = 0 , n = a.length;
        for(int i = 0 ; i < n ; i++)
            if(a[i] > firstMax)
            {
                secondMax = firstMax;
                firstMax = a[i];
            }
            else if(a[i] > secondMax)
                secondMax = a[i];

        return (firstMax - 1) * (secondMax - 1);
    }
}
20

配列LeetcodeソリューションでXNUMXつの要素の最大積を見つける複雑さの分析

時間の複雑さ

O(N)、N = 配列のサイズ。 単純な比較操作のために線形ループを実行します。

スペースの複雑さ

O(1)、 一定のメモリが使用されるため。