【leetcode】169.多数元素

文章目录


碎碎念

好困...但是项目还有一点东西还在改,等改完传完github跟友友们同步一下就休息,趁ai帮我看问题的时候再写一篇吧。


一、题目

二、思路和题解

1.思路

非常简单粗暴!因为多数元素是说是出现次数大于⌊ n/2 ⌋ 的元素,也就是说,如果数组有5个元素,那么多数元素就至少出现3次;如果数组有10个元素,那么多数元素就至少出现6次。

从这里我们就可以开始发现一些规律了。题目说了保证数组中一定有一个多数元素,那我们如果把所有的多数元素放在一起,它一定会覆盖nums[n/2]。我们可以考虑极端情况,如果多数元素刚好是这个数组中最小的数,那我们把它们都放在一起,也就是都放在最前面,因为多数元素的出现次数大于⌊ n/2 ⌋,所以nums[n/2]一定是多数元素;同样的,如果是最大的,也一样直接去找nums[n/2]

那下一步就是考虑怎么把它们"放到一起"了,其实很简单刚刚我们已经有提到一点了,就是把它们按从小到大排序,这样相同的数就连着排排坐啦。到这里,我们也可以很快把代码写出来了。

2.代码(排序)

cpp 复制代码
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int n=nums.size();
        sort(nums.begin(),nums.end());
        return nums[n/2];
    }
};

三、其他解法(哈希映射)

题解里还有个哈希表的解法,其实和我上一篇找【leetcode】136.只出现一次的数那题的方法差不多,都是记录数字出现的次数,然后去找那个出现次数最多的数。

参考题解在这里。

算法:

我们用哈希映射(HashMap)来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。

我们用一个循环遍历数组 nums 并将数组中的每个元素加入哈希映射中。在这之后,我们遍历哈希映射中的所有键值对,返回值最大的键。我们同样也可以在遍历数组 nums 时候使用打擂台的方法,维护最大的值,这样省去了最后对哈希映射的遍历。

代码如下:

cpp 复制代码
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        unordered_map<int, int> counts;
        int majority = 0, cnt = 0;
        for (int num: nums) {
            ++counts[num];
            if (counts[num] > cnt) {
                majority = num;
                cnt = counts[num];
            }
        }
        return majority;
    }
};

四、错误回顾

这次也是很丝滑秒了,值得鼓励!!晚安啦~

相关推荐
Nil2084 小时前
leetcode 199二叉树的右视图
算法·leetcode·深度优先
M78佐菲5 小时前
c语言学习笔记:排序与查找方法整理
linux·c语言·笔记·学习·算法
AI备案指南-满满7 小时前
人工智能拟人化互动服务安全自评估报告的评估要点有哪些?
人工智能·算法·安全·机器人·大模型备案·算法备案
土司大王9 小时前
LeetCode hot100——两两交换链表中的节点
算法·leetcode·职场和发展
大熊背10 小时前
树莓派IspPipeline LSC模块原理详解
算法·lsc·isppipeline·mesh lsc
测试199810 小时前
Selenium 无法定位元素的几种解决方案
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
zander25810 小时前
LeetCode 300. 最长递增子序列
算法·leetcode·深度优先
欧叶冲冲冲11 小时前
Python常见数据结构的CRUD(LeetCode高频版速查)
数据结构·python·leetcode
祖力5511 小时前
Linux应用软件编程:目录IO与framebuffer
linux·运维·算法·framebuffer·目录io