标题数组中出现次数超过一半的数字
package 剑指;
import java.util.HashMap;
import java.util.Map;
/*
* 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
*/
public class Offer39数组中出现次数超过一半的数字 {
public static Map<Integer,Integer> majorityElement(int[] nums) {
Map<Integer,Integer> map =new HashMap<>();
for(int i=0;i<nums.length;i++) {
Integer v =map.get(nums[i]); //获取键
if(v==null){
map.put(nums[i],1);
}else {
map.put(nums[i],v+1);
}
}
return map;
}
public static void main(String[] args) {
int nums[] = {10,10,10,10,3,3,2,7,8,5,6};
Map<Integer,Integer> map =majorityElement(nums);
int maxkey =-1;
int maxvalue =-1; //根据Key判断
for(Map.Entry<Integer, Integer>entry:map.entrySet()) {
// System.out.println(entry.getKey()+">"+entry.getValue());
int max =entry.getValue();
//System.out.println(max);
if(max>maxvalue) {
maxvalue= max;
maxkey =entry.getKey();
}
}
System.out.println(maxkey);
}
}
方法二直接排序取一半,简单暴力
public int majorityElement(int[] nums) {
Arrays.sort(nums);//排序
return (nums[nums.length/2]);
}
方法三:效率更高,
public int majorityElement(int[] nums) {
int x = 0, votes = 0; //votes 相当于值 x相当于键
for(int num : nums){
if(votes == 0) x = num;
votes += num == x ? 1 : -1;
}
return x;
}