169.多数派の要素
サイズnの配列が与えられた場合、その中のほとんどの要素を見つけます。ほとんどの要素は、配列内で⌊n/2⌋より多く表示される要素を参照します。
配列は空ではなく、特定の配列には常に要素の大部分が存在すると想定できます。
示例 1:
输入:[3,2,3]
输出:3
示例 2:
输入:[2,2,1,1,1,2,2]
输出:2
进阶:
尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
回答:
まず、最も簡単な方法は2層のforループです。つまり、各要素を過半数としてカウントし、最後に成功した要素を返します。しかし、それはタイムアウトになります。
2番目に考えやすいのは、保存時間にハッシュテーブルを使用することですが、C言語でハッシュテーブルを使用することはより困難です。
3番目のタイプはソートです。
つまり、数が総数の半分を超えて表示される場合は、それが過半数である必要があります。
そして質問から、過半数が実際には過半数であることがわかります。
この場合、ソート後、添え字numsize / 2の数値が過半数でなければならないことがわかります。したがって、直接出力するだけです。
コード:
int cmp(int*x,int*y)
{
return *x>*y;
}
int majorityElement(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(int),cmp);
return nums[numsSize/2];
}
4番目は考えるのが簡単ではありません、それはムーアの投票方法です。
基本的な考え方は、最初の方法を最適化することです。
まず、ランダムに「候補」を見つけます。ここで、彼の定義は私たちが探しているモードです。
次に、配列のトラバースを開始します。彼と同じものがある場合は、候補者との派閥として記録され、投票が1増加します。彼と異なる場合は反対であり、投票は減少します。投票数が0に減った場合、誰も彼をサポートしていないことを意味するため、「候補者」を置き換える必要があります。つまり、次の要素がポストになります。(ここでは、派閥内のいずれかの人物が候補者として選出される限り、派閥全体が「候補者」になったことを意味すると定義しているため)
配列をトラバースした後、つまり投票した後、最後に残っている「候補」は、私たちが探しているモードです。
これは、ムーアの投票方法に関する他の人のイメージ理解のコピーです。
コアは、消費と戦うことです。
覇権のために戦う領主のゲームをプレイするために、あなたの人口が総人口の半分以上を超えていると仮定し、すべての人口が一緒に戦って死ぬことができるようにすることができます。結局、人々が生き残る国は勝利です。
その後、大きな混乱が発生し、最悪の場合、全員があなたに対して団結します(過半数になるたびにカウンターとして選択した番号に対応します)、または他の国も互いに攻撃します(他の番号が選択されますカウンターの数)ですが、内向きに戦わない限り、最終的には間違いなく勝ちます。
結局、残せるのは自分のものでなければなりません。
また、ムーアの投票方法で選ばれた候補者の総投票数は、必ずしも半分以上ではないことに注意してください。しかし、この質問は半分以上で候補者になることができる投票数を定義しているので、候補者は現在過半数です。
コード:
int majorityElement(int* nums, int numsSize){
int sco = 1;
int temp = nums[0];
for(int i=1;i<numsSize;i++)
{
if(nums[i]==temp)
{
sco++;
continue;
}
else
{
sco--;
if(sco==0)
{
temp = nums[i+1];
sco = 1;
i++;
}
}
}
return temp;
}