199、多数元素【数组】
1、多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3]
输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2
提示:
n == nums.length1 <= n <= 5 * 104-109 <= nums[i] <= 109
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
2、解题思路
1、摩尔投票
1、两个重要推论
2、推论一: 若记 众数 的票数为 +1+1+1 ,非众数 的票数为 −1-1−1 ,则一定有所有数字的 票数和 >0> 0>0 。
3、推论二: 若数组的前 aaa 个数字的 票数和 =0= 0=0 ,则 数组剩余 (n−a)(n-a)(n−a) 个数字的 票数和一定仍 >0>0>0 ,即后 (n−a)(n-a)(n−a) 个数字的 众数仍为 xxx 。
4、如图

1、补充
1、在本文中,“数组中出现次数超过一半的数字” 被称为 “众数” 。
2、需要注意的是,数学中众数的定义为 “数组中出现次数最多的数字” ,与本文定义不同。
2、代码实现
class Solution {
public int majorityElement(int[] nums) {
int x = 0; //返回最后结果
int temp = 0; //临时变量,用来记录这个数是否>0
for(int num :nums){
if(temp==0){ //如果==0,我们就进入下一个数
x = num; //把下一个数赋值给x
}
temp+= num ==x ?1:-1; //临时变量进行判断,是否+1,还是-1
}
return x;
}
}
3、数组排序法
1、解题思路
- 将num数组排序,数组中点的元素,一定是众数
注意这里有个先决条件
1、根据题目要求来说
2、我们这里的众数(结果)的个数一定要>nums.length/2
2、代码实现
class Solution {
public int majorityElement(int[] nums) {
// 先排序
Arrays.sort(nums);
// 因为多元个数必须大于nums.length/2。所有我们就可以根据求数组中位数来获取结果答案
return nums[nums.length/2];
}
}