Lc面試題1710主要元素
阿新 • • 發佈:2021-07-26
不會,我可以學;落後,我可以追趕;跌倒,我可以站起來!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)); } }