数组中出现次数超过一半的数字(Python and C++解法)

Posted 孔子?孟子?小柱子!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组中出现次数超过一半的数字(Python and C++解法)相关的知识,希望对你有一定的参考价值。

题目:

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof

思路:

  如果数组中一个数字出现的次数超过了数组长度一半,那么它出现的次数比其他所有数字出现的次数,之和还要多,因此可以进行投票,正负相抵,假设众数票额为+1,其他票额为-1,那么最终票数之和>0,如果当前票数之和为0,那么设当前数字为众数,则最后一次假设的众数一定是真众数。

Python解法:

 1 class Solution:
 2     def majorityElement(self, nums: List[int]) -> int:
 3         votes = 0  # 投票总和,假设众数票额为+1,其他为-1
 4         for num in nums:
 5             if votes == 0:  # 如果当前票数和为零,则假设当前的数字为众数
 6                 x = num
 7             if num == x:
 8                 votes += 1
 9             else:
10                 votes -= 1
11         return x

C++解法:

 1 class Solution {
 2 public:
 3     int majorityElement(vector<int>& nums) {
 4         int votes = 0;
 5         int x;  // 假设的众数
 6         for(int i = 0; i < nums.size(); i++) {
 7             if(votes == 0)
 8                 x = nums[i];
 9             if(nums[i] == x)
10                 votes += 1;
11             else
12                 votes -= 1;
13         }
14         return x;
15     }
16 };

以上是关于数组中出现次数超过一半的数字(Python and C++解法)的主要内容,如果未能解决你的问题,请参考以下文章

HDU1029:Ignatius and the Princess IV(找出数组中出现次数超过一半的数字)

剑指Offer数组中出现次数超过一半的数字 Python版

《剑指offer》---数组中出现次数超过一半的数字

剑指offer python版 数组中出现次数超过一半的数字

找出数组中出现次数超过一半的数字

出现次数超过一半的数字