问题描述
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.
问题分析
给定一个数组,当前数组中所有的出现次数超过1/3的值。做法了之前的求超过一半的值的做法有些类似,但是有不一样。这里需要设置两个值,同时得到的结果需要在一次进行判断是否超过了1/3.
代码实现
public List<Integer> majorityElement(int[] nums) {
int firstNum = 0, firstCout = 0;
int secondNum = 0, secondCout = 0;
for (int i = 0; i < nums.length; i++) {
if (firstCout!= 0 && nums[i]== firstNum){
firstCout++;
}else if (secondCout!= 0&& nums[i]== secondNum){
secondCout++;
}else if (firstCout == 0){
firstCout++;
firstNum= nums[i];
}else if (secondCout == 0){
secondCout++;
secondNum = nums[i];
}
else {
firstCout--;
secondCout--;
}
}
List<Integer> result = new ArrayList<Integer>();
if (firstCout != 0) {
if (checkLegal(nums, firstNum)) {
result.add(firstNum);
}
}
if (secondCout != 0) {
if (checkLegal(nums, secondNum)) {
result.add(secondNum);
}
}
return result;
}
/**
* 检查当前的值是否是真正的大于1/3
*
* @param nums
* @param secondNum
* @return
*/
private boolean checkLegal(int[] nums, int secondNum) {
int count = 0;
for (int num : nums) {
if (num == secondNum) {
count++;
}
}
int target = nums.length / 3;
return target < count;
}