题目的链接在这里:https://leetcode-cn.com/problems/majority-element/
题目大意
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
一、示意图
二、解题思路
首先一种是直接用中位数 然后还有一种是用摩尔投票数,还有HashMap方法
中位数
代码如下:
class Solution {
//有一种特别简单的方法 直接排序 然后输出中位数的地方
public int majorityElement(int[] nums) {
//先进行边界判断
if(nums==null)
return 0;
Arrays.sort(nums);
int len=nums.length;
if(len==1){
return nums[0];
}
return nums[len/2];
}
}
HashMap方法
代码如下:
class Solution {
public int majorityElement(int[] nums) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
//先进行边界判断吧
if(nums.length==1)
return nums[0];
//但是HashMap是会把所有的都放进去的哎 可是我们需要的是 那个key value对应的最大值
//所有都不用选n/2 就选value最大的那个就行了
int i=0;
while (i<nums.length){
if(!hashMap.containsKey(nums[i])){
//说明key中没有的话
hashMap.put(nums[i],1);
}
else{
//如果有的话 就需要把对应的value加一了吧 就是这个方法吧 get得到的是value
int temp=hashMap.get(nums[i]);
temp++;
hashMap.put(nums[i],temp);
}
i++;
}
//然后应该排序找到最大的那个 再输出的是key呀。。。
//{1=1, 2=2} 说明结果是正确的 但是就怎么输出的问题了 这里 应该是通过value来得到key
int temp_result=0;
int temp_value=0;
for(Integer key:hashMap.keySet()){
if(hashMap.get(key)>temp_value){
//这个时候就是通过找到value来找到key
temp_result=key;
temp_value=hashMap.get(key);
}
}
//最后应该就是结果了
return temp_result;
}
}
Boyer-Moore Majority Vote
代码如下:
class Solution {
/**
* 最后就是这个 摩尔投票法 在数组中找到两个不同的元素并删除他们,不断重复此操作,直到数组中元素都相同
* 那么剩下的元素就是主要元素
* 按照代码的思路是这样的 先随意确定一个候选元素,当遇到一个和候选元素不同的元素时,两个数量上抵消一个,count-1,一旦
* count变成0 就重新找一个候选元素。而在这个过程中 遇到和候选元素不同的元素进行抵消的时候,候选元素和当前元素会存在两种情况
* 1.其中一个真好是主要元素 2.两者都不是主要元素 这样抵消过后 主要元素还是主要元素
*/
public int majorityElement(int[] nums) {
int n=nums.length;
int candidate=nums[0],counter=0;
for(int i:nums){
if(counter==0){
//说明没候选的 那就所谓的“随便找一个” 也就是刚开始的时候 就是第一个 之后就是counter等于0 的那个
candidate=i;
counter=1;
}
else if(candidate==i) {
//说明这个又多了一个
counter++;
}else{
counter--;
}
}
//应该这个时候就可以返回候选人了吧
return candidate;
}
}