力扣:多数元素

169多数元素

一、题目

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

1
2
输入:nums = [3,2,3]
输出:3

示例 2:

1
2
输入:nums = [2,2,1,1,1,2,2]
输出:2

提示:

  • n == nums.length
  • 1 <= n <= 5 * 104
  • -109 <= nums[i] <= 109

二、解题

方法一:排序+滑动窗口思想

假设⌊ n/2 ⌋的结果为interLen,则由题意可知’多数‘一定存在,那么一定存在i,使得nums[i]===nums[i+interLen])成立(滑动窗口思想)。

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
let interLen=Math.floor(nums.length/2);
nums.sort();
for(let i=0;i<nums.length;i++){
if(nums[i]===nums[i+interLen]){
return nums[i];
}
}
};

方法二:排序,取出数组中间数

因为“多数元素”一定存在,则有序后得到的数组的中间元素一定就是“多数元素”。

1
2
3
4
5
6
7
8
9
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
nums.sort((a,b)=>a-b);
let mid=Math.floor(nums.length/2);
return nums[mid];
};

方法三:枚举(哈希表版)

使用哈希表记录每个元素的个数,最后再得出出现次数大于⌊ n/2 ⌋的元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
let myMap=new Map();
for(let i=0;i<nums.length;i++){
if(myMap.has(nums[i])){//哈希表中已经存在当前元素
myMap.set(nums[i],myMap.get(nums[i])+1);
}else{
myMap.set(nums[i],1);
}
}
console.log(myMap);
let len=Math.ceil(nums.length/2);
for(let [key,value] of myMap){
// console.log(key,value);
if(value>=len){
return key;
}
}
};

力扣:多数元素
https://chen77.top/2024/03/03/leetcode/169多数元素/
作者
小陈
发布于
2024年3月3日
许可协议