力扣-求众数

135 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前言

数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。 始终记得在参加字节青训营的时候,月影老师说过的一句话,不要问前端学不学算法。计算机学科的每一位都有必要了解算法,有写出高质量代码的潜意识

一、问题描述

给定一个大小为 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
};

三、测试结果

后续

好了,本篇 力扣-求众数到这里就结束了,我是邵小白,一个在前端领域摸爬滚打的大三学生,欢迎👍评论。