From 1c724b7f7c5baea30e0377214193452483588164 Mon Sep 17 00:00:00 2001 From: = <--gbloal> Date: Sat, 1 Jun 2024 10:26:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A4=9A=E6=95=B0=E5=85=83=E7=B4=A0(16?= =?UTF-8?q?9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- leetcode/简单/多数元素.js | 129 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 leetcode/简单/多数元素.js diff --git a/leetcode/简单/多数元素.js b/leetcode/简单/多数元素.js new file mode 100644 index 0000000..451ff69 --- /dev/null +++ b/leetcode/简单/多数元素.js @@ -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]));