web-dev-qa-db-ja.com

配列の最大の違いを見つける方法

整数の配列があるとします。

int[] A = { 10, 3, 6, 8, 9, 4, 3 };

私の目標は、Q> PとなるようなA [Q]とA [P]の最大の違いを見つけることです。

たとえば、P = 2およびQ = 3の場合、

diff = A[Q] - A[P]
diff = 8 - 6
diff = 2

P = 1およびQ = 4の場合

diff = A[Q] - A[P]
diff = 9 - 3
diff = 6

6はすべての違いの中で最大の数なので、それが答えです。

私の解決策は次のとおりです(C#で)が、非効率的です。

public int solution(int[] A) {

    int N = A.Length;
    if (N < 1) return 0;

    int difference;
    int largest = 0;

    for (int p = 0; p < N; p++)
    {
        for (int q = p + 1; q < N; q++)
        {
            difference = A[q] - A[p];
            if (difference > largest)
            {
                largest = difference;
            }
        }
    }

    return largest;
}

O(N)で実行されるように、これをどのように改善できますか?ありがとう!

最大値と最小値を取得するだけでは機能しません。被減数(Q)は、減算(P)の後に来る必要があります。

この質問は、codilityの「Max-profit」問題に基づいています( http://codility.com/train/ )。私のソリューションのスコアは66%にすぎませんでした。 100%のスコアには、O(N)が必要です。

11
Randal Cunanan

次のコードはO(n)およびshould仕様に準拠しています(codilityの予備テストは成功しました))で実行されます。

public int solution(int[] A)
{
    int N = A.Length;
    if (N < 1) return 0;

    int max = 0;
    int result = 0;

    for(int i = N-1; i >= 0; --i)
    {
        if(A[i] > max)
            max = A[i];

        var tmpResult = max - A[i];        
        if(tmpResult > result)
            result = tmpResult;
    }

    return result;
}

更新:
ソリューションとして提出しましたが、スコアは100%です。

2016年2月26日更新:
codilityに関する元のタスクの説明には、「配列Aの各要素は[0..1,000,000,000]の範囲内の整数である」と記載されていました。
負の値も許可されている場合、上記のコードは正しい値を返しません。これは、maxの宣言をint max = int.MinValue;に変更することで簡単に修正できます。

20
Daniel Hilgarth

これがO(n) Java実装

public static int largestDifference(int[] data) {
    int minElement=data[0], maxDifference=0;

    for (int i = 1; i < data.length; i++) {
        minElement = Math.min(minElement, data[i]);
        maxDifference = Math.max(maxDifference, data[i] - minElement);
    }
    return maxDifference;
}
3
craftsmannadeem

いくつかの試みの後、私はこれで終わります:

int iMax = N - 1;
int min = int.MaxValue, max = int.MinValue;
for (int i = 0; i < iMax; i++) {
    if (min > A[i]) min = A[i];                                     
    if (max < A[N - i - 1]){
      iMax = N - i - 1;
      max = A[iMax];
    }        
 }
 int largestDiff = max - min;

[〜#〜] note [〜#〜]:いくつかのケースでテストしました。それがうまくいかない場合を見つけたら、コメントで知らせてください。私はそれを改善するか、答えを削除しようとします。ありがとう!

1
King King

PHPソリューション

<?php
$a = [0,5,0,5,0];
$max_diff = -1;
$min_value = $a[0];
for($i = 0;$i<count($a)-1;$i++){
    if($a[$i+1] > $a[$i]){
        $diff = $a[$i+1] - $min_value;
        if($diff > $max_diff){
            $max_diff = $diff;
        }
    } else {
        $min_value = $a[$i+1];
    }
}
echo $max_diff;
?>
0
afrizaliman
  int FirstIndex = -1;
            int SecondIndex = -1;
            int diff = 0;

            for (int i = A.Length-1; i >=0; i--)
            {
                int FirstNo = A[i];
                int tempDiff = 0;
                for (int j = 0; j <i ; j++)
                {
                    int SecondNo = A[j];
                    tempDiff = FirstNo - SecondNo;
                    if (tempDiff > diff)
                    {
                        diff = tempDiff;
                        FirstIndex = i;
                        SecondIndex = j;
                    }
                }
            }

            MessageBox.Show("Diff: " + diff + "   FirstIndex: " + (FirstIndex+1) + "   SecondIndex: " + (SecondIndex+1));
0
user2831284