前言
数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。 始终记得在参加字节青训营的时候,月影老师说过的一句话,不要问前端学不学算法。计算机学科的每一位都有必要了解算法,有
写出高质量代码的潜意识
。
一、问题描述
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3] 输出:3
示例 2:
输入:[2,2,1,1,1,2,2] 输出:2
进阶:
- 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题
二、思路讲解
2.1 哈希表解法
方法很简单,迭代数组的每一项,存入哈希表当中,如果存在就将其值+1,最后返回值最大的那一项。
var majorityElement = function(nums) { const map = new Map() let maxNum = 0 let max = 0 for(const num of nums){ if(map.has(num)){ map.set(num,map.get(num)+1) }else{ map.set(num,1) } } for(const [key,value] of map){ if(value>max){ max = value maxNum = key } } return maxNum };
2.2 排序法
问题中说到,众数是数组中个数大于 n/2 的元素,那么排序完返回最中间的元素即可。
var majorityElement = function(nums) { nums.sort((a,b)=>a-b) return nums[(nums.length)>>1] // nums.length >> 1 等同于 Math.floor(nums.length / 2) };
2.3 投票法
投票法啥意思呢? 就是遇到同样的数字就票数+1,不同就票数-1,记录当前票数不为零的值。
var majorityElement = function(nums) { let count = 0 , res for(const num of nums){ if(count==0){ res = num } count += res === num ? 1 : -1 } return res };
三、测试结果
后续
- 地址: 求众数
好了,本篇 力扣-求众数
到这里就结束了,我是邵小白,一个在前端领域摸爬滚打的大三学生,欢迎👍评论。