leetcode-169. 多数元素学习笔记(c++)

写在前面

题目详情

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:
输入: [3,2,3]
输出: 3

示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2

ac代码

class Solution
{
public:
    int majorityElement(vector<int>& nums)
    {
        int cnt = 0;
        int hxuan = -1;
        for(int num : nums)
        {
            if(num == hxuan)
            {
                cnt++;
            }
            else if(--cnt < 0)
            {
                hxuan = num;
                cnt = 1;
            }
        }
        return hxuan;
    }
};
  • 注意: 摩尔选票法的直接应用,因为题目说明一定存在大多数,所以不用进行第二阶段
  • 算法代码(墙裂推荐)
/*
根据多数元素出现的次数大于n/2且超过其它元素出现次数之和这一特点,进行统计

时间复杂度为:O(n)
空间复杂度为:O(1)
*/
int majorityElement(vector<int>& nums) {
	int k = 0, cand = 0;
	// 步骤1:成对抵销阶阶段
	for(auto num:nums){
		if(k == 0){
			cand = num;
			k = 1;
		}
		else{
			if(num == cand){
				++k;
			}
			else{
				--k;
			}
		}
	}
	// 步骤2:计数阶段 判断cand的个数是否超过一半
	k = 0;
	for(auto num:nums){
		if(num == cand){
			++k;
		}
	}
	if(k <= nums.size() / 2){
		cand = -1;//表示未超过一半 
	}
	return cand;
}
```:
- 文章参考
	- [摩尔投票法(Boyer–Moore majority vote algorithm)](https://blog.csdn.net/happyeveryday62/article/details/104136295)
	- [LeetCode169.多数元素](https://blog.csdn.net/CSDNzhwk/article/details/104833227/)
	- [摩尔投票算法动态演示网站](https://www.cs.utexas.edu/~moore/best-ideas/mjrty/index.html)

版权声明:本文为qq_24452475原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。