1. 程式人生 > 其它 >Lc面試題1710主要元素

Lc面試題1710主要元素

package com.leetcode.leetcode.licm;

/**
 * @description: 面試題 17.10. 主要元素
 * 陣列中佔比超過一半的元素稱之為主要元素。給你一個 整數 陣列,找出其中的主要元素。若沒有,返回 -1 。請設計時間複雜度為 O(N) 、空間複雜度為 O(1) 的解決方案。
 * <p>
 * <p>
 * <p>
 * 示例 1:
 * <p>
 * 輸入:[1,2,5,9,5,9,5,5,5]
 * 輸出:5
 * 示例 2:
 * <p>
 * 輸入:[3,2]
 * 輸出:-1
 * 示例 3:
 * <p>
 * 輸入:[2,2,1,1,1,2,2]
 * 輸出:2
 * @author: licm
 * @create: 2021-07-26 09:52
 **/
public class Lc面試題1710主要元素 {

    /**
     * 考點 摩爾投票
     * <p>
     * 首先請考慮最基本的摩爾投票問題,找出一組數字序列中出現次數大於總數1/2的數字(並且假設這個數字一定存在)。
     * 顯然這個數字只可能有一個。摩爾投票演算法是基於這個事實:每次從序列裡選擇兩個不相同的數字刪除掉(或稱為“抵消”),
     * 最後剩下一個數字或幾個相同的數字,就是出現次數大於總數一半的那個。請首先認同這個事實,這裡不證明了~
     * <p>
     * <p>
     * 這裡需要維護倆個變數 marjor 眾數,count 眾數出現的次數
     *
     * @param nums
     * @return
     */
    public static int majorityElement(int[] nums) {
        int major = 0;
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            if (count == 0) {

                major = nums[i];
                count++;
            } else {
                count = nums[i] == major ? ++count : --count;
            }
        }

        /**
         * 這裡需要二次校驗  對應測試案例 【1,2,3】
         */
        count = 0;
        for (int i = 0; i < nums.length; i++) {
            if (major == nums[i]) {
                count++;
            }
        }
        return count * 2 > nums.length ? major : -1;
    }

    public static void main(String[] args) {
        int[] nums = {1, 2, 5, 9, 5, 9, 5, 5, 5};
//        int[] nums = {1, 2, 3};
        System.out.println(majorityElement(nums));
    }
}

不會,我可以學;落後,我可以追趕;跌倒,我可以站起來!