
解法一:将所有元素放入HashMap中,利用HashMap中的键的唯一性,将重复元素对应的值value+1,当获取到全部元素后,遍历HashMap的键获取出最符合条件的那一个元素
public static int majorityElement1(int[] nums) {
//key为nums元素, value为元素的个数
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int num :nums){
if(map.get(num) != null){
//包含这个元素,给 value值加1
map.put(num, map.get(num)+1);
}else{
map.put(num,1);
}
}
//获取value最大的元素
for(Integer key : map.keySet()){
if(map.get(key) > (nums.length/2)){
return key;
}
}
return -1;
}
解法二:剔除元素法,
- 设置两个变量,1 是数组的多数元素候选 numH,并将其初始化为数组的第一个元素,2 是设计一个计数器count 并初始为 1。
- 遍历数组,将数组中的元素与 numH 进行比较,
- 若二者相同,则 count++
- 若不相同,则 count - -,- -的操作会使得 numH 避开数组中的那些少数元素
- 在 - - 前应该先判断此时的 count 是否为 0
- 若count == 0 ,则意味着数组中前面不相同的元素已经跳过了,所以要重置count与numH,重复前面的操作,知道数组遍历完,此时剩下的numH就是我们要的值。
- 若count != 0,则进行–
public static int majorityElement(int[] nums) {
//将数组的第一个数设为多数元素候选值
int numH = nums[0];
//设置一个计数器 count=1;
int count = 1;
//循环比较
for(int i = 1; i<nums.length ;i++){
//判断多数元素候选值与下一个元素是否相等
if(numH == nums[i]){
//是,count++;
count++;
}else{
// 否,先判断count == 0
if(count == 0){
// 是将这两个元素从数组中删除,并重置数据
count = 1;
numH = nums[i];
}else{
//否,count--;
count--;
}
}
}
//返回多数元素候选值
return numH;
}
来源:CSDN
作者:Emma-Zhang
链接:https://blog.csdn.net/it_is_me_a/article/details/104847576