アルゴリズムパンチカード(1)------ゲームの勝者

Likou1535-アレイゲームの勝者を探す

タイトル説明:

ここに画像の説明を挿入

例:

ここに画像の説明を挿入

演算結果:

ここに画像の説明を挿入

問題解決のアイデア:

実際、この質問は比較的単純です。つまり、配列の最初の2つの要素が比較されるたびに、大きい数字が配列の先頭に配置され、小さい数字が配列の最後に配置されます。
ここに画像の説明を挿入

ここで最初の2つを比較します。配列を更新すると、2、3、5、4、6、7、1になります。次に、arr [0]とarr [1]を比較して、2と3を比較します。 2は前回の比較の大きい方の値であり、3は前回比較した2つの数値の最後の値です。したがって、ここでは、大きい方の数値を使用して、前回の比較の大きい方の値を置き換えることができます。 、したがって、小さい値は私たちに影響を与えないので、無視することができます。大きい方の値を次の値と比較するだけです。

ここに画像の説明を挿入

ここでは、各比較で大きい値と大きい値の数を記録するだけで済みます。

トラバーサルが完了し、kの値に達していない場合、この時点で配列を観察することで確認できます。
ここに画像の説明を挿入

一度トラバースすると、配列の最初の位置が配列の最大値であることがわかります。つまり、K値が大きすぎると、配列の長さよりも大きくなります。トラバース後にK値に到達しますが、最終的には、配列の最大値は配列の一番上にある必要があります。また、後でどのように変更しても、 topは変更されず、常に配列の最大値です。

このように考えることもできます.kが配列の長さよりも大きい場合、結果は配列の最大値である必要があります。

コード

public int getWinner(int[] arr, int k) {
    /**
     * 这里有一个非常重要的线索就是,无论目标值是多少,遍历一遍后最大值一定在第一个
     */
    if(arr.length==0) return 0;
    if(arr.length==1) return arr[0];
    int bigger=arr[0];
    int count=0;
    int temp=bigger;
    for(int i=1;i<arr.length;i++)
    {
        bigger=Math.max(bigger,arr[i]);
        if(bigger==temp){
            count++;
        }else{
            temp=bigger;
            count=1;
        }
        if(count==k) return bigger;
    }
    return bigger;
}

おすすめ

転載: blog.csdn.net/qq_44762290/article/details/113101286