LeetCode – Majority Element II (Java)

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

Java Solution

This problem is similar to Majority Element I. Time = O(n) and Space = O(1).

public List<Integer> majorityElement(int[] nums) {
    List<Integer> result = new ArrayList<>();
 
    Integer n1 = null, n2 = null;
    int c1 = 0, c2 = 0;
 
    for (int i : nums) {
        if (n1 != null && i == n1.intValue()) {
            c1++;
        } else if (n2 != null && i == n2.intValue()) {
            c2++;
        } else if (c1 == 0) {
            c1 = 1;
            n1 = i;
        } else if (c2 == 0) {
            c2 = 1;
            n2 = i;
        } else {
            c1--;
            c2--;
        }
    }
 
    c1 = c2 = 0;
 
    for (int i : nums) {
        if (i == n1.intValue()) {
            c1++;
        } else if (i == n2.intValue()) {
            c2++;
        }
    }
 
    if (c1 > nums.length / 3)
        result.add(n1);
    if (c2 > nums.length / 3)
        result.add(n2);
 
    return result;
}

Reference:
A Linear Time Majority Vote Algorithm

Category >> Algorithms >> Interview  
If you want someone to read your code, please put the code inside <pre><code> and </code></pre> tags. For example:
<pre><code> 
String foo = "bar";
</code></pre>
  • alexwest11

    Given an integer array of size n, find all elements that appear more

    ———-

    i am not sure it is solution for ALL. , just any element n/3+ repeated!!

    for reference , see

    https://www.geeksforgeeks.org/n3-repeated-number-array-o1-space/

  • West

    first sample is not space O(n) блять

  • Dima

    да это же просто пиздец…