多数元素(简单)
2020年5月20日
题目来源:力扣
解题
首先用比较熟悉的哈希表方法,记录个数还有出现次数最多的一个key值,最后输出这个key值。
这种方法时间复杂度和空间复杂度都为O(n)。
class Solution {
public int majorityElement(int[] nums) {
Map<Integer,Integer> m=new HashMap<>();
int len=nums.length/2,max=1,max_key=nums[0];
for(int i:nums){
if(m.containsKey(i)){
int value=m.get(i);
m.put(i,value+1);
if(value+1>max){
max=value+1;
max_key=i;
}
}
else{
m.put(i,1);
}
}
return max_key;
}
}
排序法
这个很巧妙,从小到大进行排序后,按题目规则,下标为n/2的元素肯定为众数,也就是我们要求的数。
这种方法:
将数组排序的时间复杂度为O(nlogn);
如果使用语言自带的排序算法,需要使用 O(logn) 的栈空间。如果自己编写堆排序,则只需要使用 O(1)O(1) 的额外空间。
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
}
投票法
如果候选人不是maj 则 maj,会和其他非候选人一起反对 会反对候选人,所以候选人一定会下台(maj==0时发生换届选举)
如果候选人是maj , 则maj 会支持自己,其他候选人会反对,同样因为maj 票数超过一半,所以maj 一定会成功当选
这种方法时间复杂度为O(n),空间复杂度为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;
}
}