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
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/
first sample is not space O(n) блÑÑ‚ÑŒ
да Ñто же проÑто пиздец…