多数元素
数组
题目
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3]
输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2
提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
Related Topics
数组
哈希表
分治
计数
排序
👍 1828
👎 0
class Solution {
public int majorityElement(int[] nums) {
}
}
思路
- 使用HashMap存储
- key为值,value为次数
- 每出现一次次数+1
实现
class Solution {
public int majorityElement(int[] nums) {
if (nums.length==1)return nums[0];
Map<Integer,Integer> map = new HashMap<>();
int max=0;
int res = nums[0];
for (int n:nums){
if (map.containsKey(n)){
int value =map.get(n)+1;
if (value>max){
res = n;
max = value;
}
map.put(n,value);
}
else {
if (1>max){
max=1;
res = n;
}
map.put(n,1);
}
}
return res;
}
}
结果
解答成功:
执行耗时:18 ms,击败了5.42% 的Java用户
内存消耗:45.5 MB,击败了49.82% 的Java用户
思路
- 看解析后,发现有计数法,也叫摩尔投票法
- 主要原理是因为有一个元素超过了半数
- 用一个标记数,相等+1,否则-1,最终会得到需要的那个数
优化1
class Solution {
public int majorityElement(int[] nums) {
//当前元素
int a=0;
//计数器
int count =0;
for (int n: nums){
//计数器为0.赋值
if (count==0) {
a=n;
count++;
}
//计数器不为0,相等+1,不等-1
else {
if (a==n){
count++;
}
else {
count--;
}
}
}
return a;
}
}
结果
解答成功:
执行耗时:1 ms,击败了99.53% 的Java用户
内存消耗:47.7 MB,击败了7.76% 的Java用户
排序法
思路
- 排序
- 因为最大值超过半数,所以取中间值即可
实现
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
}
结果
解答成功:
执行耗时:2 ms,击败了61.16% 的Java用户
内存消耗:47.8 MB,击败了7.03% 的Java用户