LeetCode刷题之找出众数2

109 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


题目描述

给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

示例1 :

输入:[3,2,3]
输出:[3]

示例2:

输入:nums = [1]
输出:[1]

思路1:哈希

class Solution {
    public List<Integer> majorityElement(int[] nums) {
   int len=nums.length;
        ArrayList<Integer> list = new ArrayList<>();
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i=0;i<len;i++){
            if (map.containsKey(nums[i])){
                Integer integer = map.get(nums[i]);
                integer+=1;
                map.put(nums[i],integer);
            }else {
                map.put(nums[i],1);
            }
        }
        int Len=len/3;
        for(Map.Entry<Integer,Integer> entry:map.entrySet()){
            if (entry.getValue()>Len){
                list.add(entry.getKey());
            }
        }
        return list;
    }
}

思路2:摩尔投票法

每次剔除不同的三个数,最后剩下的一个或者两个不同的数一定存在"众数"(众数存在的情况下)。

class Solution {
    public List<Integer> majorityElement(int[] nums) {
      int[][] res=new int[2][2];
      List<Integer> list=new ArrayList<>();
      res[0][0]=nums[0];
      res[0][1]=1;
      int i=1;
      for(;i<nums.length;i++){
          if(nums[i]!=res[0][0]){
                res[1][0]=nums[i];
                res[1][1]=1;
                i++;
                break;
          }else{
              res[0][1]+=1;
          }
      }
      if(res[1][1]==0){
          list.add(res[0][0]);
          return list;
      }
      for(;i<nums.length;i++){
          if(nums[i]!=res[0][0] && nums[i]!=res[1][0]){
              if(res[0][1]==0){
                  res[0][0]=nums[i];
                  res[0][1]=1;
              }else if(res[1][1]==0){
                  res[1][0]=nums[i];
                  res[1][1]=1;
              }else{
                  res[0][1]-=1;
                  res[1][1]-=1;
              }
          }else if(nums[i]==res[0][0]){
              res[0][1]+=1;
          }else if(nums[i]==res[1][0]){
              res[1][1]+=1;
          }
      }
      res[1][1]=0;
      res[0][1]=0;
      for(int j=0;j<nums.length;j++){
          if(nums[j]==res[0][0]){
              res[0][1]+=1;
          }
          if(nums[j]==res[1][0]){
              res[1][1]+=1;
          }
      }
      if(res[0][1]>nums.length/3){
          list.add(res[0][0]);
      } 
      if(res[1][1]>nums.length/3){
          list.add(res[1][0]);
      }
      return list;
    }
}