feat: 多数元素(169)
This commit is contained in:
parent
498bc7ce76
commit
1c724b7f7c
129
leetcode/简单/多数元素.js
Normal file
129
leetcode/简单/多数元素.js
Normal file
@ -0,0 +1,129 @@
|
||||
/*
|
||||
169. 多数元素
|
||||
已解答
|
||||
简单
|
||||
|
||||
相关标签
|
||||
相关企业
|
||||
给定一个大小为 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) 的算法解决此问题。
|
||||
*/
|
||||
|
||||
// 思路1: 排序,在取1/2
|
||||
// /**
|
||||
// * @param {number[]} nums
|
||||
// * @return {number}
|
||||
// */
|
||||
// var majorityElement = function(nums) {
|
||||
// nums.sort((a,b)=>a-b)
|
||||
// return nums[nums.length>>1]
|
||||
// };
|
||||
|
||||
// 思路2: 遍历整个数组,每一项作为key存入map中,value为出现的次数,最后遍历map,找到最大值
|
||||
// /**
|
||||
// * @param {number[]} nums
|
||||
// * @return {number}
|
||||
// */
|
||||
// const majorityElement = function (nums) {
|
||||
// const len = nums.length;
|
||||
// const map = new Map();
|
||||
// for (let i = 0; i < len; i++) {
|
||||
// map.set(nums[i], (map.get(nums[i]) || 0) + 1);
|
||||
// }
|
||||
// // 遍历map
|
||||
// let result;
|
||||
// let maxValue = -Infinity;
|
||||
// for (const [key, value] of map.entries()) {
|
||||
// if (value > maxValue) {
|
||||
// maxValue = value;
|
||||
// result = key;
|
||||
// }
|
||||
// }
|
||||
// return result;
|
||||
// };
|
||||
|
||||
// 思路4: 如果数 a 是数组 nums 的众数,如果我们将 nums 分成两部分,那么 a 必定是至少一部分的众数。
|
||||
// /**
|
||||
// * @param {number[]} nums
|
||||
// * @return {number}
|
||||
// */
|
||||
// function majorityElement(nums) {
|
||||
// // 递归函数
|
||||
// function majorityElementRec(lo, hi) {
|
||||
// // 基本情况:子数组长度为1时,返回该元素
|
||||
// if (lo === hi) {
|
||||
// return nums[lo];
|
||||
// }
|
||||
|
||||
// // 分割数组
|
||||
// const mid = Math.floor((hi - lo) / 2) + lo;
|
||||
// const leftMajority = majorityElementRec(lo, mid);
|
||||
// const rightMajority = majorityElementRec(mid + 1, hi);
|
||||
|
||||
// // 如果左右两半的多数元素相同,直接返回
|
||||
// if (leftMajority === rightMajority) {
|
||||
// return leftMajority;
|
||||
// }
|
||||
|
||||
// // 统计左右多数元素的出现次数
|
||||
// const leftCount = countInRange(nums, leftMajority, lo, hi);
|
||||
// const rightCount = countInRange(nums, rightMajority, lo, hi);
|
||||
|
||||
// // 返回出现次数较多的元素
|
||||
// return leftCount > rightCount ? leftMajority : rightMajority;
|
||||
// }
|
||||
|
||||
// // 辅助函数:统计元素在范围内的出现次数
|
||||
// function countInRange(nums, num, lo, hi) {
|
||||
// let count = 0;
|
||||
// for (let i = lo; i <= hi; i++) {
|
||||
// if (nums[i] === num) {
|
||||
// count++;
|
||||
// }
|
||||
// }
|
||||
// return count;
|
||||
// }
|
||||
|
||||
// // 调用递归函数,初始范围为整个数组
|
||||
// return majorityElementRec(0, nums.length - 1);
|
||||
// }
|
||||
|
||||
// 思路4: 按照选举的思想,赢得选票的肯定是多数的
|
||||
|
||||
function majorityElement(nums) {
|
||||
let candidate = null; // 表示当前赢得选票的候选人
|
||||
let count = 0; // 表示当前候选人的票数
|
||||
const len = nums.length;
|
||||
|
||||
for (let i = 0; i < len; i++) {
|
||||
if (count === 0) {
|
||||
candidate = nums[i]; // 更换候选人
|
||||
count = 1;
|
||||
} else if (nums[i] === candidate) { // 票数增加
|
||||
count++;
|
||||
} else { // 票数减少
|
||||
count--;
|
||||
}
|
||||
}
|
||||
|
||||
return candidate;
|
||||
}
|
||||
|
||||
console.log(majorityElement([12, 2, 3, 1, 1, 1, 1]));
|
Loading…
x
Reference in New Issue
Block a user