如何找出数组里出现次数超过总数1/3的数 Java实现
作者:互联网
数组里出现次数超过总数1/3的数最多有两个。
三个不相同的数字为一组,删掉每一组。剩下的就是出现次数超过总数1/3的数。
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<Integer> majorityElement(int[] nums) {
ArrayList<Integer> ans = new ArrayList<Integer>();
if (nums == null || nums.length == 0)
return ans;
int a = nums[0], cnta = 0; //我用a b分别表示两个不一样的数
int b = nums[0], cntb = 0;
for (int num : nums) {
//1.和a相等
if (num == a) {
cnta++;
continue;
}
//2.和b相等
if (num == b) {
cntb++;
continue;
}
//3.没a了,将当前数设为a
if (cnta == 0) {
a = num;
cnta++;
continue;
}
//4.没b了,将当前数设为b
if (cntb == 0) {
b = num;
cntb++;
continue;
}
//5.不是新a & 不是新b & 和a不等 & 和b不等
cnta--;//删掉一组,a计数-1
cntb--;//删掉一组,b计数-1
}
cnta = 0;
cntb = 0;
//统计a,b在数组中出现的次数
for (int num : nums) {
if (num == a) {
cnta++;
} else if (num == b) {
cntb++;
}
}
//a出现次数超过1/3,加入结果
if (cnta > nums.length / 3) {
ans.add(a);
}
//b出现次数超过1/3,加入结果
if (cntb > nums.length / 3) {
ans.add(b);
}
return ans;
}
}
标签:找出,Java,cntb,cnta,nums,++,int,num,数组 来源: https://blog.csdn.net/weixin_42970433/article/details/111504896