力扣169. 多数元素

 

 

题目:【https://leetcode.cn/problems/majority-element/?envType=study-plan-v2&envId=top-interview-150

这个题目跟找数量最多的数字有区别,这里面的算法也属于单独适合这个题的算法。

通常来说,看到这种题目第一想法是哈希表,遇到数量高于一半的就返回即可,但是这需要额外的空间,不满足题目要求。

第二个想到的,就是时间复杂度稍微高一点的,排序一下,这样空间复杂度就降低了,如下代码。

1 class Solution {
2 public:
3     int majorityElement(vector<int>& nums) {
4         int n = nums.size();
5         sort(nums.begin(), nums.end());
6         return nums[n / 2];
7     }
8 };

 

这里题解中提到了一个分治的方式,不过跟排序方法一样,时间复杂度还是不满足题目要求,就不去探索了。

 

然而此时还是不能满足题目要求,所以参考题解的投票法,但是这个方法能用的前提是,统计的是超过半数的数字,如果没有这个前提,投票法可能行不通

这里的投票法指的是,先假设这个多数,然后再次遇到多数就count++,如果遇到的不是多数,count--,如果count归零了,就重新选择多数,再继续按照刚才的逻辑。

 1 class Solution {
 2 public:
 3     int majorityElement(vector<int>& nums) {
 4         int n = nums.size();
 5         int t = nums[0];
 6         int c = 1;
 7 
 8         for (int i = 1; i < n; ++i) {
 9             if (0 == c) {
10                 t = nums[i];
11                 c = 1;
12             } else {
13                 if (t == nums[i]) c++;
14                 else c--;
15             }
16         }
17         return t;
18     }
19 };

 

posted @ 2025-06-03 09:55  J&YANG  阅读(10)  评论(0)    收藏  举报