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.
题目链接:https://leetcode.com/problems/majority-element/
题目分析:题目本身不难,所以方法有很多种,本文介绍的两种方法都是O(n)时间,O(1)空间的
模拟的方法就是设一个计数器,对当前出现次数最多的数计数,因为总是存在,所以最后计数器的值必不为0
public class Solution {
public int majorityElement(int[] nums) {
int n = nums.length;
int cnt = 0;
int num = 0;
for (int i = 0; i < n; i ++) {
if (cnt == 0) {
num = nums[i];
cnt ++;
continue;
}
if (nums[i] == num) {
cnt ++;
}
else {
cnt --;
}
}
return num;
}
}
位运算:考虑到一个数字出现次数大于n/2,那么显然对应的二进制位数字出现的次数也大于总的n/2
public class Solution {
public int majorityElement(int[] nums) {
int n = nums.length;
int ans = 0;
for (int i = 31; i >= 0 ; i --) {
int cnt0 = 0;
for (int j = 0; j < n; j ++) {
if ((nums[j] & (1 << i)) == 0) {
cnt0 ++;
}
}
ans <<= 1;
ans += (cnt0 > (n >> 1)) ? 0 : 1;
}
return ans;
}
}