【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;
    }
};

四、错误回顾

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

相关推荐
寻寻觅觅☆5 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
偷吃的耗子6 小时前
【CNN算法理解】:三、AlexNet 训练模块(附代码)
深度学习·算法·cnn
化学在逃硬闯CS6 小时前
Leetcode1382. 将二叉搜索树变平衡
数据结构·算法
ceclar1237 小时前
C++使用format
开发语言·c++·算法
Gofarlic_OMS7 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
夏鹏今天学习了吗7 小时前
【LeetCode热题100(100/100)】数据流的中位数
算法·leetcode·职场和发展
忙什么果8 小时前
上位机、下位机、FPGA、算法放在哪层合适?
算法·fpga开发
董董灿是个攻城狮8 小时前
AI 视觉连载4:YUV 的图像表示
算法
ArturiaZ9 小时前
【day24】
c++·算法·图论
大江东去浪淘尽千古风流人物9 小时前
【SLAM】Hydra-Foundations 层次化空间感知:机器人如何像人类一样理解3D环境
深度学习·算法·3d·机器人·概率论·slam