インタビューの質問39:配列内の出現回数が半分を超える数(C ++)

タイトルアドレス: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 < intint > mp;
        forint i = 0 ; i <nums.size(); i ++ 
        { 
            mp [nums [i]] ++ ; 
        } 
        forint j = 0 ; j <nums.size(); j ++ 
        { 
            if(mp [nums [j]]> nums.size()/ 2return  [j];
        } 
        return 0 ; 
    } 
};

アイデア3

クラスSolution {
 public int majorElement(vector < int >&nums){
         int vote = 0 ;
        int型の大多数。// 众数
        forint i = 0 ; i <nums.size(); i ++ 
        { 
            if(vote == 0Majority = nums [i];
            if(nums [i] ==多数決)vote ++ ;
            他の
                投票 - ; 
        } 
        過半数を返す
    }
};

アイデア4

クラスSolution {
 public int majorElement(vector < int >&nums){
         int cnt = 1 ;
        int res = nums [ 0 ];
        forint i = 1 ; i <nums.size(); i ++ 
        { 
            if(res == nums [i])cnt ++ ;
            それ以外の場合 cnt-- ;
            if(cnt == 0 
            { 
                res = nums [i]; 
                cnt =1 ; 
            } 
        } 
        return res; 
    } 
};

おすすめ

転載: www.cnblogs.com/wzw0625/p/12697294.html