演算法:Majority Element(求眾數)
說明
演算法:Majority Element
LeetCode地址:https://leetcode.com/problems/majority-element/
題目:
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.
Example 1:
Input: [3,2,3]
Output: 3
Example 2:
Input: [2,2,1,1,1,2,2]
Output: 2
解題思路
題意是從陣列中找出出現次數最多的數,而且最多的數大於一半 ⌊ n/2 ⌋,步驟如下:
1. 如果陣列只有一個數直接返回第一個數,
2. 用HashMap儲存key為出現的數字,value為出現次數
3. 跟已經儲存的最大出現次數比較,如果大於,則儲存最大出現次數,和該數字。
4. 時間複雜度為O(n)
程式碼實現
import java.util.HashMap;
import java.util.Map;
public class MajorityElement {
public int majorityElement(int[] nums) {
if (nums.length == 1) {
return nums[0];
}
int majorityKey = 0;
int majorityCount = 0;
Map<Integer, Integer> numCountMap = new HashMap<>();
for (int num: nums) {
if (numCountMap.containsKey(num)) {
numCountMap.put(num, numCountMap.get(num) + 1);
if (numCountMap.get(num) > majorityCount) {
majorityCount = numCountMap.get(num);
majorityKey = num;
}
} else {
numCountMap.put(num, 1);
}
}
return majorityKey;
}
public static void main(String[] args) {
int[] inputNums = {2,2,1,1,1,2,2};
System.out.println("Output: " + new MajorityElement().majorityElement(inputNums));
}
}
結果輸出
Output: 2
程式碼執行效率
Runtime: 25 ms, faster than 19.42% of Java online submissions for Majority Element.
Memory Usage: 43.4 MB, less than 20.42% of Java online submissions for Majority Element.
總結
實為考察重複數字出現, 時間複雜度為O(n)。注意:儲存最大資料的時候,考慮只有一個數的情況,只有一個數就沒有比較,也就是初始資料。
程式碼下載:
https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/MajorityElement.java
相關文章
- LeetCode 之 JavaScript 解答第169題 —— 求眾數 I(Majority Element)LeetCodeJavaScript
- LeetCode 169. Majority ElementLeetCode
- 演算法題:求眾數演算法
- 【演算法】求眾數-js解法演算法JS
- 優化的求眾數方法 - 摩爾投票演算法(演算法思想+求眾數的三種方法+摩爾投票演算法改進版求眾數 II)優化演算法
- 【演算法】已知必存在眾數,求該眾數 -- Boyer-Moore 投票演算法演算法
- 求眾數
- 【leetcode】求眾數LeetCode
- 演算法面試題彙總_2求眾數演算法面試題
- 雜湊求眾數
- 求眾數、排序演算法、二分法排序演算法
- 【20190326】【每天一道演算法題】求眾數(分治演算法)演算法
- Leetcode刷題——求眾數LeetCode
- 每日一算--求眾數
- 【LeetCode】求眾數(四種方法)LeetCode
- LeetCode169求眾數——分治LeetCode
- LeetCode每日一題:求眾數(No.169)LeetCode每日一題
- 水題 求眾數 (hash的練習)
- 分治演算法-眾數問題演算法
- 【演算法練習】(8)眾數演算法
- 每日一道演算法題--leetcode 169--求眾數--python--兩種方法演算法LeetCodePython
- Leetcode 169:求眾數(最詳細的解法!!!)LeetCode
- 求取眾數及重數的演算法實現(Java)演算法Java
- 分治法求眾數和重數(含檔案輸入輸出)
- [資料結構與演算法]15 兩行程式碼就可以搞定求眾數,但還有更巧的資料結構演算法行程
- 一個小小的演算法題:求兩數之和演算法
- 求最大公公約數(最大公因數)—— 歐幾里得演算法演算法
- 演算法設計與分析:求兩個自然數的最大公約數演算法
- 均值、中位數、眾數
- 【演算法】GPLT - L1 - 求整數段和(10分)演算法
- 演算法金 | 平均數、眾數、中位數、極差、方差,標準差、頻數、頻率 一“統”江湖演算法
- 求完全數個數
- 求一個演算法...演算法
- 演算法案例2-求冰雹數 java程式碼實現演算法Java
- python語言程式設計——求最大公約數和最小公倍數演算法Python程式設計演算法
- PHP演算法練習二:求n和指定數的絕對差PHP演算法
- We've all been spoiled by Tom Brady's tumble: for the vast majority of quarterbaAST
- 求正整數