最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)LeetCode(169.求大多數(shù))

 更新時間:2021年08月02日 14:50:11   作者:Grandyang  
這篇文章主要介紹了C++實現(xiàn)LeetCode(169.求大多數(shù)),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下

[LeetCode] 169. Majority Element 求大多數(shù)

Given an array nums of size n, return the majority element.

The majority element is the element that appears more than ⌊n / 2⌋ times. You may assume that the majority element always exists in the array.

Example 1:

Input: nums = [3,2,3]
Output: 3

Example 2:

Input: nums = [2,2,1,1,1,2,2]
Output: 2

Constraints:

  • n == nums.length
  • 1 <= n <= 5 * 104
  • -231 <= nums[i] <= 231 - 1

Follow-up: Could you solve the problem in linear time and in O(1) space?

這是到求大多數(shù)的問題,有很多種解法,其中我感覺比較好的有兩種,一種是用哈希表,這種方法需要 O(n) 的時間和空間,另一種是用一種叫摩爾投票法 Moore Voting,需要 O(n) 的時間和 O(1) 的空間,比前一種方法更好。這種投票法先將第一個數(shù)字假設為過半數(shù),然后把計數(shù)器設為1,比較下一個數(shù)和此數(shù)是否相等,若相等則計數(shù)器加一,反之減一。然后看此時計數(shù)器的值,若為零,則將下一個值設為候選過半數(shù)。以此類推直到遍歷完整個數(shù)組,當前候選過半數(shù)即為該數(shù)組的過半數(shù)。不仔細弄懂摩爾投票法的精髓的話,過一陣子還是會忘記的,首先要明確的是這個叼炸天的方法是有前提的,就是數(shù)組中一定要有過半數(shù)的存在才能使用,下面來看本算法的思路,這是一種先假設候選者,然后再進行驗證的算法?,F(xiàn)將數(shù)組中的第一個數(shù)假設為過半數(shù),然后進行統(tǒng)計其出現(xiàn)的次數(shù),如果遇到同樣的數(shù),則計數(shù)器自增1,否則計數(shù)器自減1,如果計數(shù)器減到了0,則更換下一個數(shù)字為候選者。這是一個很巧妙的設定,也是本算法的精髓所在,為啥遇到不同的要計數(shù)器減1呢,為啥減到0了又要更換候選者呢?首先是有那個強大的前提存在,一定會有一個出現(xiàn)超過半數(shù)的數(shù)字存在,那么如果計數(shù)器減到0了話,說明目前不是候選者數(shù)字的個數(shù)已經跟候選者的出現(xiàn)個數(shù)相同了,那么這個候選者已經很 weak,不一定能出現(xiàn)超過半數(shù),此時選擇更換當前的候選者。那有可能你會有疑問,那萬一后面又大量的出現(xiàn)了之前的候選者怎么辦,不需要擔心,如果之前的候選者在后面大量出現(xiàn)的話,其又會重新變?yōu)楹蜻x者,直到最終驗證成為正確的過半數(shù),佩服算法的提出者啊,代碼如下:

C++ 解法一:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int res = 0, cnt = 0;
        for (int num : nums) {
            if (cnt == 0) {res = num; ++cnt;}
            else (num == res) ? ++cnt : --cnt;
        }
        return res;
    }
};

Java 解法一:

public class Solution {
    public int majorityElement(int[] nums) {
        int res = 0, cnt = 0;
        for (int num : nums) {
            if (cnt == 0) {res = num; ++cnt;}
            else if (num == res) ++cnt;
            else --cnt;
        }
        return res;
    }
}

下面這種解法利用到了位操作 Bit Manipulation 來解,將這個大多數(shù)按位來建立,從0到31位,每次統(tǒng)計下數(shù)組中該位上0和1的個數(shù),如果1多,那么將結果 res 中該位變?yōu)?,最后累加出來的 res 就是過半數(shù)了,相當贊的方法,參見代碼如下:

C++ 解法二:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int res = 0, n = nums.size();
        for (int i = 0; i < 32; ++i) {
            int ones = 0, zeros = 0;
            for (int num : nums) {
                if (ones > n / 2 || zeros > n / 2) break;
                if ((num & (1 << i)) != 0) ++ones;
                else ++zeros;
            }
            if (ones > zeros) res |= (1 << i);
        }
        return res;
    }
};

Java 解法二:

public class Solution {
    public int majorityElement(int[] nums) {
        int res = 0, n = nums.length;
        for (int i = 0; i < 32; ++i) {
            int ones = 0, zeros = 0;
            for (int num : nums) {
                if (ones > n / 2 || zeros > n / 2) break;
                if ((num & (1 << i)) != 0) ++ones;
                else ++zeros;
            }
            if (ones > zeros) res |= (1 << i);
        }
        return res;
    }
}

Github 同步地址:

https://github.com/grandyang/leetcode/issues/169

類似題目:

Majority Element II

參考資料:

https://leetcode.com/problems/majority-element/

https://leetcode.com/problems/majority-element/discuss/51613/O(n)-time-O(1)-space-fastest-solution

https://leetcode.com/problems/majority-element/discuss/51612/6-Suggested-Solutions-in-C++-with-Explanations

https://leetcode.com/problems/majority-element/discuss/51611/Java-solutions-(sorting-hashmap-moore-voting-bit-manipulation).

https://leetcode.com/problems/majority-element/discuss/51828/C++-solution-using-Moore's-voting-algorithm-O(n)-runtime-comlexity-an-no-extra-array-or-hash-table

到此這篇關于C++實現(xiàn)LeetCode(169.求大多數(shù))的文章就介紹到這了,更多相關C++實現(xiàn)求大多數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言實現(xiàn)簡易連連看游戲

    C語言實現(xiàn)簡易連連看游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡易連連看游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++使用new和delete進行動態(tài)內存分配與數(shù)組封裝

    C++使用new和delete進行動態(tài)內存分配與數(shù)組封裝

    這篇文章主要介紹了C++使用new和delete進行動態(tài)內存分配與數(shù)組封裝,運行期間才能確定所需內存大小,此時應該使用new申請內存,下面我們就進入文章學習具體的操作方法,需要的小伙伴可以參考一下
    2022-03-03
  • VisualStudio Community2019在安裝的過程中無法進入安裝界面的解決方法

    VisualStudio Community2019在安裝的過程中無法進入安裝界面的解決方法

    這篇文章主要介紹了VisualStudio Community2019在安裝的過程中無法進入安裝界面的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • C++中的const和constexpr詳解

    C++中的const和constexpr詳解

    C++ const 和 constexpr 的區(qū)別呢,constexpr表示這玩意兒在編譯期就可以算出來(前提是為了算出它所依賴的東西也是在編譯期可以算出來的)。而const只保證了運行時不直接被修改(但這個東西仍然可能是個動態(tài)變量)。下面我們來詳細講解下。
    2016-01-01
  • C字符串與C++中string的區(qū)別詳解

    C字符串與C++中string的區(qū)別詳解

    以下是對C字符串與C++中string的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • c++仿函數(shù)和函數(shù)適配器的使用詳解

    c++仿函數(shù)和函數(shù)適配器的使用詳解

    這篇文章主要介紹了c++仿函數(shù)和函數(shù)適配器的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C++示例講解friend static const關鍵字的用法

    C++示例講解friend static const關鍵字的用法

    靜態(tài)成員static是解決同一個類的不同對象之間數(shù)據和函數(shù)共享問題。區(qū)分全局變量,全局變量也能實現(xiàn)數(shù)據共享,但安全性和封裝性被破壞了,友元提供了不同類或對象的成員函數(shù)之間、類的成員函數(shù)與一般函數(shù)之間進行數(shù)據共享的機制,const常引用-被引用的對象不能被更新
    2022-06-06
  • C語言實現(xiàn)手寫字符串處理工具的示例代碼

    C語言實現(xiàn)手寫字符串處理工具的示例代碼

    這篇文章主要為大家詳細介紹了利用C語言實現(xiàn)手寫字符串處理工具的相關資料,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2022-09-09
  • C中qsort快速排序使用實例

    C中qsort快速排序使用實例

    在學習C++ STL的sort函數(shù),發(fā)現(xiàn)C中也存在一個qsort快速排序,要好好學習下C的庫函數(shù)啊
    2014-01-01
  • C++11中列表初始化機制的概念與實例詳解

    C++11中列表初始化機制的概念與實例詳解

    在我們實際編程中,我們經常會碰到變量初始化的問題,對于不同的變量初始化的手段多種多樣,下面這篇文章主要給大家介紹了關于C++11中列表初始化機制的相關資料,需要的朋友可以參考下
    2021-11-11

最新評論

修文县| 彝良县| 汽车| 邹城市| 开封县| 进贤县| 界首市| 敦化市| 体育| 宝丰县| 辽阳县| 民乐县| 苍梧县| 南昌县| 务川| 原阳县| 容城县| 垫江县| 巴彦淖尔市| 海阳市| 靖安县| 迭部县| 衢州市| 军事| 浠水县| 伊通| 罗山县| 苗栗市| 新野县| 桃园县| 昆山市| 平武县| 阿克| 南陵县| 施秉县| 临朐县| 乐山市| 甘谷县| 靖宇县| 建宁县| 太白县|