Majority Element II——LeetCode
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.
题目大意:给定一个大小为n的数组,找出Majority元素,满足出现次数大于 ⌊ n/3 ⌋
次。
解题思路:大于 ⌊ n/3 ⌋
次,那么应该最多有两个Majority元素,之前有道题是找出 大于⌊ n/2 ⌋
次Majority元素,这道题有点类似,稍微复杂一点,还是利用投票算法,count作为对元素的计数,候选元素等于当前元素则count+1,否则减1,count等于0则更换候选元素。
public List<Integer> majorityElement(int[] nums) { List<Integer> res = new ArrayList<>(); if (nums == null || nums.length == 0) { return res; } int can1 = nums[0], can2 = nums[0], cnt1 = 1, cnt2 = 0; for (int i = 1; i < nums.length; i++) { int num = nums[i]; if ((cnt1 == 0 && num != can2)) { can1 = num; } else if (cnt2 == 0 && num != can1) { can2 = num; } if (num == can1) { cnt1++; } else if (num == can2) { cnt2++; } else { cnt1--; cnt2--; } cnt1 = cnt1 < 0 ? 0 : cnt1; cnt2 = cnt2 < 0 ? 0 : cnt2; } cnt1 = 0; cnt2 = 0; for (int num : nums) { if (num == can1) { cnt1++; } else if (num == can2) { cnt2++; } } if (cnt1 > nums.length / 3) res.add(can1); if (cnt2 > nums.length / 3) res.add(can2); return res; }