题目要求:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
示例1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
-------------------------------------------------------
思路:将数组排序后,第i个数和第i+数组长度一半的数相等时,返回i
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
for(int i = 0; i < nums.length;i++){
if(nums[i] == nums[i+nums.length/2]){
return nums[i];
}
}
return -1;
}
}
由于数组中的某数字出现的次数超过数组长度的一半(大于length/2),所以排序后,该数字一定在中间。
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length / 2];
}
}
时间复杂度:O(nlogn)。将数组排序的时间复杂度为 O(nlogn)
空间复杂度:O(logn)。如果使用语言自带的排序算法,需要使用 O(logn) 的栈空间。如果自己编写堆排序,则只需要使用 O(1)的额外空间。
-------------------------------------------------------
官方给出的 空间复杂度为O(1)的方法:
class Solution {
public int majorityElement(int[] nums) {
int count = 0;
Integer candidate = null;
for (int num : nums) {
if (count == 0) {
candidate = num;
}
count += (num == candidate) ? 1 : -1;
}
return candidate;
}
}
思路
如果我们把众数记为 +1+1+1,把其他数记为 −1-1−1,将它们全部加起来,显然和大于 0
,从结果本身我们可以看出众数比其他数多。