说明
算法: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