Everlasting Pages

返回

[Leetcode 169] 摩尔投票法#

感觉很新奇的算法,记录下来。

题意#

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数大于 n/2n / 2 的元素,且保证数组中存在多数元素。

思路#

哈希表的方法很简单,但是需要 O(N)O(N) 的空间复杂度,那么有什么方法能把这 O(N)O(N) 的空间复杂度省下来呢?

我们可以对数组中的数字做一个标记,若数字是多数元素,则标记为 +1+1 ,若不是多数元素, 则标记为 −1-1 。把所有数字加起来,我们可以认为所有标记的和是大于 00 的。

基于此,我们可以开始遍历数组了。我们需要维护一个标记和 sumsum 与我们暂时认为是多数元素的数 xx 。若标记和为 00,我们便可以假设我们假设的多数元素 xx 为当前这个数。若之后再次遇到 xx ,标记和加一,若不是 xx,标记和减一。最终返回数 xx 即可。

这就相当于把数组切成很多个标记为 00 的分段,而且最后一定会遇到一个标记和大于 00 的分段。因为若在这个区间内 xx 的数量和其他数字的数量和相抵消,若这个 xx 就是多数元素,多数元素的数量在剩下的区间内仍然是最多的。也就是说我们可以保证抵消不会影响多数元素的结果。因此我们可以通过这个空间复杂度为 O(1)O(1),时间复杂度为 O(N)O(N) 的算法来解决这个问题。

下面是代码:

[Leetcode 169] 摩尔投票法
https://blog.everlasting.xin/blog/leetcode-229-%E6%91%A9%E5%B0%94%E6%8A%95%E7%A5%A8%E6%B3%95/
Author Everlasting
Published at 2026年9月21日

评论前请阅读隐私政策,请勿在公开评论中填写敏感信息。

评论正在加载,若长时间未显示,请刷新页面重试。