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;
}