数组中超过一半的元素
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解法一:
利用排序算法,因为这个数字的出现次数超过数组长度的一半,所以排序之后,中间的数必定为答案
int majorityElement(vector<int>& nums) {
sort(nums.begin(), nums.end());
return nums[nums.size() / 2];
}
解法二:
因为这个数字出现次数超过数组长度的一半,所以
目标数字的个数 -其他数字的个数总和 >= 1
,故我们利用这个性质当我们遇到目标是+1,否则-1,当count为0是重置index,之后index记录的位置一定是目标数字
int majorityElement(vector<int>& nums) {
int cnt = 0, ret = 0;
for(int i = 0; i < nums.size(); ++i){
if(cnt == 0) ret = nums[i];
if(nums[i] == ret) cnt++;
else cnt--;
}
return ret;
}