タイトルアドレス:https : //leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/
タイトルの説明
配列の半分の長さを超える数が配列にあります。この数を見つけてください。配列は空ではないと想定でき、指定された配列には常に大多数の要素が存在します。
質問の例
例1:
入力:[1、2、3、2、2、2、5、4、2]
出力:2
問題解決のアイデア
アイデア1:配列を最初にソートし、次に中央の数値を取得します。これは、ソート後、中央の要素が数値の半分以上でなければならないためです。
アイデア2:ハッシュテーブルは各数値の発生数をカウントし、発生数が半分を超えると要素を返します。
アイデア3:投票方法を使用して選挙を実施します。各要素が過半数の選択に参加できます。自分と同じ場合、投票++を追加します。自分とは異なる投票、つまり投票-を追加し、最後に残りの投票を追加します降りてくるのは、タイトルに必要なものです。
アイデア4:数字の半分以上が、他のすべての数字を組み合わせたものよりも頻繁に現れる
プログラムのソースコード
アイデア1
クラスSolution { public : int majorElementElement( vector < int >&nums ){ sort(nums.begin()、nums.end()); nums [nums.size()/ 2 ];を返します。 } };
アイデア2
クラスSolution { public : int majorElementElement(vector < int >&nums){ unordered_map < int、int > mp; for(int i = 0 ; i <nums.size(); i ++ ) { mp [nums [i]] ++ ; } for(int j = 0 ; j <nums.size(); j ++ ) { if(mp [nums [j]]> nums.size()/ 2)return [j]; } return 0 ; } };
アイデア3
クラスSolution { public : int majorElement(vector < int >&nums){ int vote = 0 ; int型の大多数。// 众数 for(int i = 0 ; i <nums.size(); i ++ ) { if(vote == 0)Majority = nums [i]; if(nums [i] ==多数決)vote ++ ; 他の 投票 - ; } 過半数を返す。 } };
アイデア4
クラスSolution { public : int majorElement(vector < int >&nums){ int cnt = 1 ; int res = nums [ 0 ]; for(int i = 1 ; i <nums.size(); i ++ ) { if(res == nums [i])cnt ++ ; それ以外の場合 cnt-- ; if(cnt == 0 ) { res = nums [i]; cnt =1 ; } } return res; } };