题目地址:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
题目示例
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
解题思路
思路1:对数组先排序,然后取中间的数,因为排序后中间的元素一定是出现超过一半的数字。
思路2:哈希表统计每个数字出现的次数,当出现的次数超过一半的时候返回该元素。
思路3:利用投票法进行选举,每个元素都可以参与众数选择,遇到和自己相同的则加一票,即vote++,遇到和自己不同的减一票,即vote--,最终剩下来的即题目所要求的。
思路4:超过一半的数字出现的次数比其它所有数字出现的次数的总和多
程序源码
思路1
class Solution { public: int majorityElement(vector<int>& nums) { sort(nums.begin(), nums.end()); return nums[nums.size()/2]; } };
思路2
class Solution { public: int majorityElement(vector<int>& nums) { unordered_map<int, int> mp; for(int i = 0; i < nums.size(); i++) { mp[nums[i]]++; } for(int j = 0; j < nums.size(); j++) { if(mp[nums[j]] > nums.size() / 2) return nums[j]; } return 0; } };
思路3
class Solution { public: int majorityElement(vector<int>& nums) { int vote = 0; int majority; //众数 for(int i = 0; i < nums.size(); i++) { if(vote == 0) majority = nums[i]; if(nums[i] == majority) vote++; else vote--; } return majority; } };
思路4
class Solution { public: int majorityElement(vector<int>& nums) { int cnt = 1; int res = nums[0]; for(int i = 1; i < nums.size(); i++) { if(res == nums[i]) cnt++; else cnt--; if(cnt == 0) { res = nums[i]; cnt = 1; } } return res; } };