Majority Element
LeetCode.169. Majority Element Given an array nums
of size n
, return the majority element. The majority element is the element that appears more than ⌊n / 2⌋
times. You may assume that the majority element always exists in the array.
Example:
Input: nums = [2,2,1,1,1,2,2]
Output: 2
给定一个大小为 n 的数组
nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
First Solution
public static int majorityElement(int[] nums) {
int index = 0;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.get(nums[i]) == null) {
map.put(nums[i], 1);
} else {
map.put(nums[i], map.get(nums[i]) + 1);
}
}
for (Integer integer : map.keySet()) {
if (map.get(integer) > nums.length / 2) {
index = integer;
}
}
return index;
}
遍历整个数组,对记录每个数值出现的次数(利用HashMap,其中key为数值,value为出现次数);
接着遍历HashMap中的每个Key,寻找其value值 > nums.length / 2的key
Better Solution
public static int majorityElement(int[] nums) {
int count = 1;
int index = nums[0];
for (int i = 1; i < nums.length; i++) {
if (index == nums[i]){
count++;
}else {
count--;
if(count == 0){
index = nums[i+1];
}
}
}
return index;
}
摩尔投票法:Boyer–Moore majority vote algorithm:
从第一个数开始count=1,遇到相同的就加1,遇到不同的就减1,
减到0就重新换个数开始计数,总能找到最多的那个数字;
以下是一道关于摩尔投票法的进阶题目:
LeetCode.229.Majority Element II
Given an integer array of size n
, find all elements that appear more than ⌊ n/3 ⌋
times.
给定一个大小为 n 的整数数组,找出其中所有出现超过
⌊ n/3 ⌋
次的元素。
Solution Version
public List<Integer> majorityElement(int[] nums) {
List<Integer> list = new ArrayList<>();
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.get(nums[i]) == null) {
map.put(nums[i], 1);
} else {
map.put(nums[i], map.get(nums[i]) + 1);
}
}
for (Integer integer : map.keySet()) {
if (map.get(integer) > nums.length / 3) {
list.add(integer);
}
}
return list;
}
原方法修改参数,返回为list即可