feat: 多数元素(169)

This commit is contained in:
= 2024-06-01 10:26:36 +08:00
parent 498bc7ce76
commit 1c724b7f7c

View 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]));