数组中出现次数超过一半的数字
- 数组排序
将数组排序后,数组中间的数一定是最又可能出现次数超一半的数字,遍历数组判断该数是否出现次数超过一半,若超过一半该数字就是最后结果,若没有出现一半,则该数组没有次数超过一半的数字
代码:
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
int temp=nums[nums.length/2];
int num=0;
for (int i = 0; i <nums.length ; i++) {
if(nums[i]==temp)
num++;
}
return num*2>nums.length? temp:0;
}
}
- Hashmap方法
利用hashmap,遍历数组将数组加入到map里,若map里有该数,将value加1,若加1后的value超过一半,则返回该数;若没超半,就讲原来的value+1加到map中。
public int majorityElement(int[] nums) {
Map<Integer,Integer> map=new HashMap<>();
for (int i = 0; i <nums.length ; i++) {
if (map.containsKey(nums[i])){
int temp=map.get(nums[i]);
if (++temp*2>nums.length)
return nums[i];
map.remove(nums[i]);
map.put(nums[i],temp+1);
}
else map.put(nums[i],1);
}
return 0;
}
- 摩尔投票法
题目要求是一定有出现次数超过一半的数存在,所以最坏的情况如下,假设该数为x
两个数不一样则相抵,所以最后存在的数一定是x
代码:
public int majorityElement(int[] nums) {
int target =nums[0];
int count=0;
for(int i=0;i<nums.length;i++){
if(count==0) target=nums[i];
if(nums[i]==target){
count++;
}else{
count--;
}
}
return target;
}
若题目没有说数组一定存在次数超过一半的数,则可以判断一下是否该数正确
public int majorityElement(int[] nums) {
int target =nums[0];
int count=0,num=0;
for(int i=0;i<nums.length;i++){
if(count==0) target=nums[i];
if(nums[i]==target){
count++;
}else{
count--;
}
}
for(int i=0;i<nums.length;i++){
if(target==num[i]) num++;
}
return num*2>nums.length? target:0;
}