剑指Offer_39_数组中出现次数超过一半的数字
❗️LeetCode_169_多数元素
题目描述:
1 2 3 4 5 6 7
| 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2
限制:1 <= 数组长度 <= 50000
|
解法1:哈希表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public: int majorityElement(vector<int>& nums) {
unordered_map<int,int> map;
int k = nums.size() / 2;
for (int i = 0;i < nums.size();++i) {
++map[nums[i]];
if (map[nums[i]] > k) return nums[i]; }
return NULL; } };
|
解法2:摩尔投票法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class Solution { public: int majorityElement(vector<int>& nums) {
if (nums.empty()) return {};
int m = 0,msize = 0,n = 0,nsize = 0;
for (auto num : nums) {
if (m == num) msize++;
else if (n == num) nsize++;
else if (msize == 0) m = num,msize++;
else if (nsize == 0) n = num,nsize++;
else msize--,nsize--; }
msize = nsize = 0;
for (auto num : nums) {
if (num == m) msize++; else if (num == n) nsize++; }
if (msize > nums.size() / 2) return m; if (nsize > nums.size() / 2) return n; return NULL; } };
|