力扣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 };