LeetCode No.169 Majority Element | #Hashmap #Boyer–Moore majority vote algorithm

Q:

Given an array of size n, find the majority element. The majority element is the element that appears more than ? n/2 ? times. You may assume that the array is non-empty and the majority element always exist in the array.

A:

使用Hashmap最基本的思路。

public int majorityElement(int[] nums) {
    Map<Integer, Integer> myMap = new HashMap<Integer, Integer>();
    //Hashtable<Integer, Integer> myMap = new Hashtable<Integer, Integer>();
    int target = 0;
    for (int num: nums) {
        if (!myMap.containsKey(num))   //如果出現(xiàn)一個(gè)數(shù)之前不在map里
            myMap.put(num, 1);     //放進(jìn)去 <原值,計(jì)數(shù)>
        else
            myMap.put(num, myMap.get(num)+1);  //如果存在,計(jì)數(shù)+1

        if (myMap.get(num)>nums.length/2) {   
            target = num;
            break;                //不一定traverse整個(gè)nums,也許結(jié)果就出來(lái)了
        }
    }
    return target;
}

BoyerMoore majority vote algorithm
基本思路:最初設(shè)置兩個(gè)值,一個(gè)target,一個(gè)count,分別進(jìn)行統(tǒng)計(jì)。target從選取nums[0]開始,每當(dāng)計(jì)數(shù)變成0的時(shí)候,target值就會(huì)換。其實(shí)可以按“消除”的想法去理解,比如target值是3,連續(xù)出現(xiàn)了四次,那么這個(gè)時(shí)候count=4,但是連續(xù)又連續(xù)出現(xiàn)了五次不是3的值,那么count不僅被清0了,而且target的值也被替換了,從新開始統(tǒng)計(jì)。到最后,都“消除”完了,還能成為target,說(shuō)明具有數(shù)量上的優(yōu)勢(shì),也就是我們要找的“大量”、“總數(shù)過(guò)半”的值。


public int majorityElement(int[] num) {
    int target = num[0], count = 1;
    
    for(int i = 1; i < num.length;i++){
        if(major == num[i]){
            count ++;
        }
        else if(count == 0){
            count ++;
            target = num[i];
        }
        else count --;        
    }

    return target;
}

test case: {5,4,3,3,7,3,1,3,3} total: 9,length:9

target count point to index (i) point to value (num[i])
5 1 1 4
5 0 2 3
3 1 3 3
3 2 4 7
3 1 5 3
3 2 6 1
3 1 7 3
3 2 8 3

同樣的算法,下面這個(gè)代碼更好:

public int majorityElement(int[] nums) {
    int target = 0, count = 0;
    for (int num: nums) {
        if (count == 0)
            target = num;    //每次target值被賦值替換完,下面的判斷直接進(jìn)行計(jì)數(shù)累加,0-->1
        
        if (num != target)
            count --;
        else
            count ++;
    }
    return target;
}

test case: {5,4,3,3,7,3,1,3,3} total: 9,length:9

major count point to index (i) point to value (num[i])
0 0 0 5
5 1 1 4
5 0 2 3
3 1 3 3
3 2 4 7
3 1 5 3
3 2 6 1
3 1 7 3
3 2 8 3

注:
兩個(gè)表格,得出的結(jié)果一樣,只不過(guò)起點(diǎn)不一樣。
表格前兩列是(再次)進(jìn)入for循環(huán)之前的值,后兩列是進(jìn)入for之后要與前兩列去比較的值,比較完之后,根據(jù)判斷語(yǔ)句得出的結(jié)果,寫入下一行的前兩列。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容