Majority Element
题目来源:https://leetcode.com/problemset/algorithms/
- 问题描述
- 解题思路
- 代码实现
问题描述
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.
You may assume that the array is non-empty and the majority element always exist in the array.
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
解题思路
第一个思路
看到这道题的第一个想法就是排序,但是想到排序可能会超过时间限制,并没有采用这个方案。
第二个思路
是动态分配一个数组sum并初始化为0,遍历整个已知数据的数组nums,且sum[nums[i]]++,当sum[nums[i]] > n/2时,majority element就是nums[i]。但我忽略了nums[i]的数据可以很大,这样就没有办法确定动态分配的数组的大小,所以这个思路也是不可行的。
第三个思路
majority element的数量一定比非majority element的数字的数目多。
(1)那么假定第一个数字是majority element,并设置变量sum为0。
(2)遍历数组nums,如果sum为0,则设置majority为num[i],sum++。
否则,如果nums[i]等于majority element,sum++;
如果nums[i]不等于majority element,sum–。
(3)若所假定为majority element就是真正的majority element, 则sum–时就相当于用一个majority element抵消了一个非majority element,sum == 0时,剩余的数字中仍是majority element的数目多于非majority element。
(4)若所假定的majority element并非真正的majority element。则当sum==0时,剩余的数字也一定是majority element的数目多于非majority element。
(4)那么最后遍历完数组时,此时majority element的值一定是真正的majority element。
代码实现
class Solution {
public:
int majorityElement(vector<int>& nums) {
int sum = 0;
int majority;
vector<int>::iterator it;
vector<int>::iterator it1;
for (it = nums.begin(); it != nums.end(); it++) {
if (it == nums.begin()) {
majority = *it;
sum++;
} else {
if (sum == 0) {
sum++;
majority = *it;
} else {
if (*it == majority) sum++;
else sum--;
}
}
}
return majority;
}
};