[LeetCode] 229. Majority Element II
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times.
Example 1:
Input: nums = [3,2,3]
Output: [3]
Example 2:
Input: nums = [1]
Output: [1]
Example 3:
Input: nums = [1,2]
Output: [1,2]
Constraints:
1 <= nums.length <= 5 * 104
-109 <= nums[i] <= 109
Follow up: Could you solve the problem in linear time and in O(1) space?
多数元素 II。
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
思路
题意跟版本一差不多,区别在于这道题是在数组里找所有出现次数大于 1/3 数组长度的元素。
题目要求时间 O(n),空间 O(1),所以思路还是投票法。对于一个数组,最多只有两个元素的出现次数超过数组长度的三分之一,所以我们这里创建两个 candidate。首先我们将这两个 candidate 初始化为 0(因为有 test case 是数组长度小于 2 的所以不能设置为 nums[0], nums[1]),然后遍历数组,按照版本一的做法,统计这两个 candidate 的出现次数。这一题需要遍历两次 input 数组,第二次遍历的时候是在验证找到的两个 candidate 是否出现次数真的大于数组长度的三分之一,若是则加入结果集。
复杂度
时间O(n) - 题目要求
空间O(1) - 题目要求
代码
Java实现
class Solution {
public List<Integer> majorityElement(int[] nums) {
List<Integer> res = new ArrayList<>();
// corner case
if (nums == null || nums.length == 0) {
return res;
}
// normal case
int candidate1 = 0;
int candidate2 = 0;
int count1 = 0;
int count2 = 0;
for (int num : nums) {
if (num == candidate1) {
count1++;
} else if (num == candidate2) {
count2++;
} else if (count1 == 0) {
candidate1 = num;
count1++;
} else if (count2 == 0) {
candidate2 = num;
count2++;
} else {
count1--;
count2--;
}
}
count1 = 0;
count2 = 0;
for (int num : nums) {
if (num == candidate1) {
count1++;
} else if (num == candidate2) {
count2++;
}
}
if (count1 > nums.length / 3) {
res.add(candidate1);
}
if (count2 > nums.length / 3) {
res.add(candidate2);
}
return res;
}
}
JavaScript实现
/**
* @param {number[]} nums
* @return {number[]}
*/
var majorityElement = function (nums) {
let res = [];
// corner case
if (nums === null || nums.length === 0) {
return res;
}
// normal case
let candidate1 = 0;
let candidate2 = 0;
let count1 = 0;
let count2 = 0;
for (let num of nums) {
if (num === candidate1) {
count1++;
} else if (num === candidate2) {
count2++;
} else if (count1 === 0) {
candidate1 = num;
count1++;
} else if (count2 === 0) {
candidate2 = num;
count2++;
} else {
count1--;
count2--;
}
}
count1 = 0;
count2 = 0;
for (let num of nums) {
if (num === candidate1) {
count1++;
} else if (num === candidate2) {
count2++;
}
}
if (count1 > Math.floor(nums.length / 3)) {
res.push(candidate1);
}
if (count2 > Math.floor(nums.length / 3)) {
res.push(candidate2);
}
return res;
};
相关题目
169. Majority Element
229. Majority Element II