数组中出现次数超过一半的次数
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
排序整理
思路
题目中说明数组中必有一个数字出现的次数超过一半,取数组长度的一半Len。首先把数组中的数字排序,则必有nums[i] = nums[i+Len],循环判断此条件是否成立,成立则输出nums[i]。
代码
class Solution {
public int majorityElement(int[] nums) {
int Len = nums.length / 2;
Arrays.sort(nums);
for (int i = 0;i<=Len;i++){
if (nums[i] == nums[i+Len]){
return nums[i];
}
}
return -1;
}
}
总结
此方法虽然得解,但是耗时和内存都是很高的,不是最佳解法。
摩尔投票法
思路
https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/mian-shi-ti-39-shu-zu-zhong-chu-xian-ci-shu-chao-3/
代码
class Solution {
public int majorityElement(int[] nums) {
int x = 0, votes = 0;
for(int num : nums){
if(votes == 0) x = num;
votes += num == x ? 1 : -1;
}
return x;
}
}
作者:jyd