①题目:
力扣229. 求众数 IIhttps://leetcode-cn.com/problems/majority-element-ii/
②代码:
//哈希
class Solution {
public List<Integer> majorityElement(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
List<Integer> list =new ArrayList<>();
for (int i : nums) {
map.put(i, map.getOrDefault(i, 0) + 1);
}
Set<Integer> integers = map.keySet();
for (Integer i:integers){
if (map.get(i)>nums.length/3)
list.add(i);
}
return list;
}
}
//遍历
class Solution {
public List<Integer> majorityElement(int[] nums) {
ArrayList<Integer> list = new ArrayList<>();
Arrays.sort(nums);
int counter=1;
boolean flag=true; //记录list的状态:是否可添加数,避免同一个数重复添加。
for (int i = 0; i < nums.length-1; i++) {
if (nums[i]==nums[i+1]) //与后一个数相同,个数加1
counter++;
else { //与后一个数不同,后一个数为1。
counter = 1;
flag=true;
}
if (counter>nums.length/3&&flag==true) {
list.add(nums[i + 1]);
flag=false;
}
}
if(nums.length<3) { //如果第一个元素个数为1,且满足条件。
if (!list.contains(nums[0]))
list.add(nums[0]);
}
return list;
}
}
//摩尔投票法求众数
class Solution {
public List<Integer> majorityElement(int[] nums) {
//首先:个数大于n/3的数不超过2个。故设置两个候选人p1,p2.
int p1=0,p2=0;
int num1=0,num2=0;
// 相互抵消:找到可能的结果。
for (int i:nums) {
if (num1 > 0 && p1==i)
num1++;
else if(num2>0&&p2==i)
num2++;
else if (num1==0) {
p1 = i;
num1++;
}
else if(num2==0) {
p2 = i;
num2++;
}
else{
num1--;
num2--;
}
}
num1=0;
num2=0;
//验证p1,p2两位候选的真实个数是否大于n/3:
for (int i :nums) {
if(i==p1)
num1++;
if(i==p2)
num2++;
}
ArrayList<Integer> list = new ArrayList<>();
if(num1>nums.length/3)
list.add(p1);
if(num2>nums.length/3)
if(!list.contains(p2))
list.add(p2);
return list;
}
}
③)运行: