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.
Follow-up: Could you solve the problem in linear time and in O(1) space?
nums
구현이 쉬운 전략
위 전략의 문제점
풀이 방법 분석
풀이 코드
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
return nums[n/2];
}
}
위의 "문제 풀이 고려 방안"에서 언급한 방법
class Solution {
public int majorityElement(int[] nums) {
int n = nums.length;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) {
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
n = n / 2;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() > n) {
return entry.getKey();
}
}
return 0;
}
}
Moore Voting Algorithm
Moore Voting Algorithm 동작 방식
풀이 코드
class Solution {
public int majorityElement(int[] nums) {
int count = 0;
int major = 0;
for (int num : nums) {
if (count == 0) {
major = num;
}
if (major == num) {
count++;
} else {
count--;
}
}
return major;
}
}
빠른 순서 : Moore Voting - Arrays Sort - Hash Map
메모리 사용량 효율순 : Hash Map - Moore Voting - Arrays Sort
Arrays Sort : JDK 자체에서 기능을 지원해주므로 코드의 양은 가장 적다.
HashMap
Moore Voting Algorithm : 특정 상황에서만 사용할 수 있는 알고리즘이므로 성능은 좋지만 다른 용도로서 거이 사용할 수 없다.