오늘도 코테 공부!
https://leetcode.com/problems/majority-element/description/
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
public int majorityElement(int[] nums) {
int len = nums.length;
if (len==1) return nums[0];
Arrays.sort(nums);
int ans = 0;
int c = 0;
for (int i = 1; i < nums.length; i++) {
if (nums[i]==nums[i-1]){
ans = nums[i];
c++;
if (c>=len/2) return ans;
} else {
c = 0;
ans = nums[i];
}
}
return -1;
}
public static int majorityElement(int[] nums) {
Map<Integer, Integer> countMap = new HashMap<>();
for (int num : nums) {
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
}
int majorityElement = 0;
int maxCount = 0;
for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) {
if (entry.getValue() > maxCount) {
majorityElement = entry.getKey();
maxCount = entry.getValue();
}
}
return majorityElement;
}
public static int majorityElement(int[] nums) {
int candidate = 0;
int count = 0;
for (int num : nums) {
if (count == 0) {
candidate = num;
}
count += (num == candidate) ? 1 : -1;
}
return candidate;
}
아주 간단한 방법으로 시간복잡도 O(N), 공간복잡도 O(1) 만으로 과반수의 원소를 찾을 수 있는 방법이다.
후보와 횟수 변수를 하나씩 선언해두고, for문을 한번만 돈다.
후보의 숫자와 순회하는 원소가 같으면 count를 증가하고, 다르면 count를 낮춘다. 이렇게 한번 순회하면 과반수의 원소가 candidate에 저장된다.
단, 과반수가 아니면 적용할 수 없다.