【摩爾投票法】leetcode 主要元素

數(shù)組中占比超過一半的元素稱之為主要元素。給定一個整數(shù)數(shù)組,找到它的主要元素。若沒有,返回-1。

示例 1:

輸入:[1,2,5,9,5,9,5,5,5]
輸出:5

示例 2:

輸入:[3,2]
輸出:-1

示例 3:

輸入:[2,2,1,1,1,2,2]
輸出:2

說明:
你有辦法在時間復雜度為 O(N),空間復雜度為 O(1) 內(nèi)完成嗎?

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/find-majority-element-lcci

思路一

排序,然后遍歷數(shù)組,設數(shù)組長度為n,假如有一個元素連續(xù)出現(xiàn)超過n/2次,那么這個元素就是主要元素,由于使用快排,時間復雜度O(nlogn),空間復雜度O(1)。

public int majorityElement(int[] nums) {
    if (nums == null || nums.length == 0) {
        return -1;
    }
    if (nums.length == 1) {
        return nums[0];
    }

    Arrays.sort(nums);

    // 當前重復次數(shù)
    int count = 1;

    for (int i = 1; i < nums.length; i++) {
        count = (nums[i] == nums[i - 1]) ? count + 1 : count;
        if (count > nums.length / 2) {
            return nums[i];
        }
    }
    return -1;
}

思路二

使用摩爾投票法,時間復雜度O(n),空間復雜度O(1)

算法思想

摩爾投票法的核心思想是抵消,如果兩個數(shù)字不同,就互相抵消,抵消到最后,肯定會剩下一個或多個相同的數(shù)字,這里有兩種情況:
1.剩下的這個數(shù)字就是主要元素,因為它的數(shù)量超過了其他所有數(shù)字的數(shù)量和,就算其他所有數(shù)字都和它抵消,也抵消不完,更何況其他數(shù)字也會互相抵消;
2.數(shù)組不存在主要元素,比如1 2 1 2 3這個例子,1和2互相抵消,最后剩下3。

算法實現(xiàn)
public int majorityElement(int[] nums) {
    // 主要元素的候選人
    int major = nums[0];
    // major的計數(shù)器,即major的數(shù)量
    int count = 1;

    for (int i = 1; i < nums.length; i++) {
        // count為0,說明前面的互相抵消完了
        if (count == 0) {
            // 重新選擇候選人
            major = nums[i];
            count = 1;
        } else {
            // 如果當前元素與候選人相同,則count+1,否則count-1,表示候選人被抵消掉一個
            count = (major == nums[i] ? count + 1 : count - 1);
        }
    }
    // count為0,說明不存在主要元素
    if (count == 0) {
        return -1;
    }
    // count不為0,不代表major就是主要元素,比如1 2 1 2 3這種情況
    // 所以還需要遍歷數(shù)組,計算major的出現(xiàn)次數(shù),判斷是否大于數(shù)組一半
    count = 0;
    int half = nums.length / 2;
    for (int i = 0; i < nums.length; i++) {
        count = nums[i] == major ? count + 1 : count;
        if (count > half) {
            return major;
        }
    }
    return -1;
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

  • 題目 給定一個長度為n的數(shù)組,找出主要元素,主要元素的定義是在數(shù)組中出現(xiàn)的次數(shù)超過n/2 假設數(shù)組非空并且給定的數(shù)...
    zhouwaiqiang閱讀 639評論 0 0
  • 如果數(shù)組中多一半的數(shù)都是同一個,則稱之為主要元素。給定一個整數(shù)數(shù)組,找到它的主要元素。若沒有,返回-1。 說明:你...
    風暴小狼閱讀 330評論 0 2
  • 2020/3/15 題目描述 給定一個大小為 n 的數(shù)組,找到其中的多數(shù)元素。多數(shù)元素是指在數(shù)組中出現(xiàn)次數(shù)大于 ?...
    icespark閱讀 306評論 0 0
  • 摘要 這篇文章由投票問題引出,討論了幾種找出占多數(shù)元素的算法,并給出最終算法的源代碼和遞歸調(diào)試過程,最后提出改進方...
    小火伴閱讀 3,487評論 0 1
  • 題目 給定一個循環(huán)數(shù)組(最后一個元素的下一個元素是數(shù)組的第一個元素),輸出每個元素的下一個更大元素。數(shù)字 x 的下...
    倚劍賞雪閱讀 735評論 0 1

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