229. Majority Element II

Given an integer array of sizen, find all elements that appear more than⌊ n/3 ⌋times. The algorithm should run in linear time and in O(1) space.

class Solution {
    public List<Integer> majorityElement(int[] nums) {
        List<Integer> ans = new ArrayList<>();
        if (nums == null || nums.length == 0) return ans;

        int candidate1 = Integer.MIN_VALUE, candidate2 = Integer.MIN_VALUE;
        int count1 = 0, count2 = 0;

        for (int num : nums){
            if (num == candidate1){
                count1++;
            }
            else if (num == candidate2){
                count2++;
            }
            else if (count1 == 0){
                candidate1 = num;
                count1 = 1;
            }
            else if (count2 == 0){
                candidate2 = num;
                count2 = 1;
            }
            else{
                count1--;
                count2--;
            }
        }

        count1 = 0;
        count2 = 0;
        for (int num : nums){
            if (num == candidate1) count1++;
            if (num == candidate2) count2++;
        }

        if (count1 > nums.length / 3 && !ans.contains(candidate1)) ans.add(candidate1);
        if (count2 > nums.length / 3 && !ans.contains(candidate2)) ans.add(candidate2);

        return ans;
    }
}

results for ""

    No results matching ""