/*
1. Arrays.sort(nums) return nums[n/2];
2. Divide and Conquer
3. Majority Voting
*/
public class Solution {
public int majorityElement(int[] nums) {
if (nums == null || nums.length < 1) return 0;
int[] tuple = new int[2];
for (int num : nums) {
if (num == tuple[0]) {
tuple[1]++;
} else if (tuple[1] > 0) {
tuple[1]--;
} else {
tuple[0] = num;
}
}
return tuple[0];
}
}
class Solution {
func majorityElement(_ nums: [Int]) -> Int {
if nums.count == 0 {
return 0
}
return helper(nums, 0, nums.count - 1)
}
private func helper(_ nums: [Int], _ left: Int, _ right: Int) -> Int {
if left == right {
return nums[left]
}
let middle = left + ((right - left) >> 1)
let leftMiddle = helper(nums, left, middle)
let rightMiddle = helper(nums, middle + 1, right)
if leftMiddle == rightMiddle {
return leftMiddle
}
var leftCount = 0
var rightCount = 0
for i in left...right {
if nums[i] == leftMiddle {
leftCount += 1
} else if nums[i] == rightMiddle {
rightCount += 1
}
}
return leftCount > rightCount ? leftMiddle : rightMiddle
}
}