1. 문제
LeetCode - Majority Element
- 배열 nums에서 배열의 길이(n)의 절반 보다 많이 존재하는 요소인 majority element를 찾는 문제
- 문제에서는 majority element가 존재한다는 가정을 하고 풀어도 좋다고 하였다.
2. 접근법
- HashMap을 사용해 요소를 key로, 요소의 등장 빈도 수를 value로 사용할지 vs 별도의 배열을 선언하여 nums의 요소를 인덱스로 사용한 뒤에 해당 인덱스의 등장 빈도수를 업데이트 하는 방법을 사용할 지 고민
- nums의 요소를 인덱스로 사용하고, 가장 큰 빈도 수가 담긴 인덱스를 반환하는 방법으로 접근
- nums의 요소가 음수도 존재할 수 있다는 제약 조건으로 첫 접근 방법 실패
- 일단 naive한 접근 방법인 이중 반복문으로 접근하여 해결 -> 향후 HashMap 사용 버전으로 개선하여 Runtime 18ms로 단축
3. 풀이
class Solution {
public int majorityElement(int[] nums) {
int maxCount = 0;
int idx = 0;
for (int i = 0; i < nums.length; i++) {
int count = 0;
for (int j = 0; j < nums.length; j++) {
if (nums[i] == nums[j]) count++;
}
if (count > maxCount) {
maxCount = count;
idx = i;
}
}
return nums[idx];
}
}
4. 성능
- Runtime : 2854ms -> 18ms
- Memory : 48.5mb -> 47.1mb
5. 개선
- 처음에 생각했던 다른 방법인 key-value 자료 구조인 HashMap을 활용하는 방법
- 시간 복잡도를 이중 반복문의 O(n*n) -> O(n)으로 개선
class Solution {
public int majorityElement(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {
int count = map.get(nums[i]) + 1;
map.put(nums[i], count);
}
else {
map.put(nums[i], 1);
}
if (map.get(nums[i]) > nums.length / 2) {
return nums[i];
}
}
return -1;
}
}