description
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.解题思路
题意是给出一个包含n个元素的数组,找到出现次数超出一半的数,且假定数组非空,一定有满足条件的majority element存在。从题意看,这个majority element出现的次数至少要比其它数出现的总次数多一次,有个简单的方法就是可以记录下数组中每个数字出现的次数,最后判断出现次数最多的数即为majority element,但是这个需要一定的空间去存储每个数字出现的次数,所以这种方法就不是很好。换一个思路考虑,在这n个数中,我们每次排除两个不同的数字,由于majority element出现次数比其它数字总的还要多,那么剩余的肯定是majority element。假设数组为{1,3,11,2,1,1,9,1,1},其中1是majority element,如果每次都拿数组中的1个元素‘1’去跟别的元素进行排除,(1,3),(1,11),(1,2),(1,9)这四对元素都排除掉,那么最终只剩一个元素即majority element “1”。再深入思考,当我们每次排除的两个不同元素里不一定有元素‘1’的时候,那么最后剩余的则会有多个元素‘1’。接下来如何转换成代码呢,既然我们每次要排除两个不相同元素,我们就可以遍历一遍这个数列依次排除,那么怎样做到排除掉一个元素呢,我们可以从头开始,将第0个元素假设为majority element,并且用count记录这个被假设为majority element出现的次数,如果下一个元素与假设的majority element 相同,那么count加一;如果不同,那么count减一,证明排除掉了这两个元素;当count为0时,证明前面的元素都因两两不同而被排除了,此时将下一个元素作为majority element,并将count重新设为1,继续遍历下去,根据我们上面文字性的推导,可以知道我们最终会得到majority element并且count会大于等于1。
代码如下
class Solution {
public:
int majorityElement(vector<int>& nums) {
int n = nums.size();
int majority_ele ;
int count = 0;
for(int i = 0; i < n ;i++){
//当count为0时,将下一个元素假定为majority element
if(count == 0){
majority_ele = nums[i];
count++;
}
else{
//如果下一元素与假定的majority element相等,count++
if(nums[i] == majority_ele){
count++;
}
//如果不等就count--,即排除掉这两个元素
else{
count--;
}
}
}
return majority_ele;
}
};
LeetCode题目原址
如有错误请指正,谢谢!