题目
题链:剑指 Offer 39. 数组中出现次数超过一半的数字
题解
官方题解:数组中出现次数超过一半的数字
有三种解法、最优算法是投票法:
- HashMap解法
很简单就是遍历数组中的元素添加到map中如果已存在这个元素就+1,不存在初始值设为0,遍历完之后再遍历hashmap找出value值大于数组长度一半的元素。
class Solution {
public int majorityElement(int[] nums) {
if (nums.length == 1){
return nums[0];
}
HashMap<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])){
map.put(nums[i],map.get(nums[i])+1);
}else {
map.put(nums[i],1);
}
}
int maxLNum = 0;
for(Integer num:map.keySet()){
if (map.get(num) > nums.length/2){
maxLNum = num;
break;
}
}
return maxLNum;
}
}
- 数组排序法
将数组排好序,取中间的点一定是众数,这里使用快速排序法。
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length / 2];
}
}
- 投票法
题目给的是超过一半的数、给定一个变量记录投票数、假设是众数表示票数+1,不是众数票数-1,遍历完数组结果肯定是正数,所以每次假设当前遍历的数是众数,记录票数变量值为0时设置当前数是众数,最终返回这个数。
public int majorityElement02(int[] nums) {
if (nums.length == 1){
return nums[0];
}
int ver = 0,x = 0;
for (int i = 0; i < nums.length; i++) {
if (ver == 0){
x = nums[i];
ver = 1;
}else {
ver += x == nums[i] ? 1:-1;
}
}
return x;
}