169. 多数元素

123 阅读1分钟

169.多数元素

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素

示例 1:
输入:[3,2,3]
输出:3

示例 2:
输入:[2,2,1,1,1,2,2]
输出:2

1、排序

给定的数组总是存在多数元素,则不需要进行非空判断,**次数 大于 ⌊ n/2 ⌋**我们只需要把这个数组排序,那么数组中间的值肯定是存在最多的元素。

public int majorityElement(int[] nums) {
   Arrays.sort(nums);
   return nums[nums.length/2];
}

2、Map

因为出现多数元素,就考虑使用Map。 map的key存放的是数组中的元素,value是数组中元素的个数,把数组中元素不断的存放到map中,如果某个元素的个数大于数组长度的一半,直接返回。

public int majorityElement(int[] nums) {
           HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();
           int length = nums.length;
           for (int i = 0; i < length; i++) {
               int count = 0;
               if (map.get(nums[i]) == null){
                   count = 1;
              }else {
                 //因为该元素还未放map中,个数提前加1
                   count = map.get(nums[i]).intValue()+1;
              }
             //数目大于一半
               if (count>length/2){
                   return nums[i];
              }
               map.put(nums[i],count);
          }
           return -1;
}

3、成对消除

该多数元素占绝大多数,像玩游戏一样,两个不同的数进行对消,剩下的依然是该元素

 public int majorityElement(int[] nums) {
     int keyValue = nums[0];
     int count = 0;
     for (int i = 0; i < nums.length; i++) {
       //开始时或,之前的元素已经对消
         if (count == 0){
             keyValue = nums[i];
             count = 1;
        }else if(keyValue == nums[i]){
           //同一个元素,直接加1
             count ++;
        }else {
           //不同元素,直接对销
             count --;
        }
    }
     return  keyValue;
}