class Solution {
//投票法:时间复杂度为O(N),空间复杂度为O(1)
//另外解法:排序、有序哈希表
public int majorityElement(int[] nums) {
int res = nums[0], count = 1;
for (int i = 1; i < nums.length; i ++) {
if (nums[i] != res) {
count --;
if (count == 0) {
res = nums[i];
count ++;
}
} else {
count ++;
}
}
return res;
}
}
// 排序
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
int left = 0;
int right = nums.length - 1;
int mid = (right - left) / 2 + left;
return nums[mid];
}
}
// 投票
class Solution {
public int majorityElement(int[] nums) {
int vote = 0;
int most = 0;
for (int num : nums) {// 循环缩小区间
if (vote == 0) {
most = num;// 票数为0,将众数设置为当前num
}
vote += num == most ? 1 : -1;// 众数为当前num,票数+1,否则票数-1
}
return most;
}
}
class Solution {
public int majorityElement(int[] nums) {
int count = 0;
int res=0;;
for(int i = 0;i<nums.length;i++){
if(count==0){
res = nums[i];
}
count+=(nums[i]==res)?1:-1;
}
return res;
}
}
class Solution {
public int majorityElement(int[] nums) {
//哈希法
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (!map.containsKey(nums[i])) {
map.put(nums[i], 1);
} else {
map.put(nums[i], map.get(nums[i]) + 1);
}
}
int res = 0;
for(Integer k : map.keySet()) {
if (map.get(k) > nums.length / 2) {
res = k;
break;
}
}
return res;
}
}
class Solution {
public:
int majorityElement(vector<int>& nums) {
if (nums.size() < 3) {
return nums[0];
}
int m = nums[0];
int count = 1;
for (int i = 1; i < nums.size(); i++) {
if(nums[i] == m) {
count++;
} else if (--count == 0) {
m = nums[i];
count = 1;
}
}
return m;
}
};
共以下 8 个回答
1、哈希map
2、摩尔投票
排序去中间值学习题解投票
使用了哈希法。不过最佳方法是投票法
两两比较,不同则消除,最后剩下的就是众数;
时间复杂度O(n),空间复杂度O(1)