169.多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素
示例 1:
输入:[3,2,3]
输出:3
示例 2:
输入:[2,2,1,1,1,2,2]
输出:2
1、排序
给定的数组总是存在多数元素,则不需要进行非空判断,**次数 大于 ⌊ n/2 ⌋**我们只需要把这个数组排序,那么数组中间的值肯定是存在最多的元素。
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
2、Map
因为出现多数元素,就考虑使用Map。 map的key存放的是数组中的元素,value是数组中元素的个数,把数组中元素不断的存放到map中,如果某个元素的个数大于数组长度的一半,直接返回。
public int majorityElement(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();
int length = nums.length;
for (int i = 0; i < length; i++) {
int count = 0;
if (map.get(nums[i]) == null){
count = 1;
}else {
//因为该元素还未放map中,个数提前加1
count = map.get(nums[i]).intValue()+1;
}
//数目大于一半
if (count>length/2){
return nums[i];
}
map.put(nums[i],count);
}
return -1;
}
3、成对消除
该多数元素占绝大多数,像玩游戏一样,两个不同的数进行对消,剩下的依然是该元素
public int majorityElement(int[] nums) {
int keyValue = nums[0];
int count = 0;
for (int i = 0; i < nums.length; i++) {
//开始时或,之前的元素已经对消
if (count == 0){
keyValue = nums[i];
count = 1;
}else if(keyValue == nums[i]){
//同一个元素,直接加1
count ++;
}else {
//不同元素,直接对销
count --;
}
}
return keyValue;
}