给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/majority-element
作者:本人
思路
拿到题想到的第一个方法就是 用哈希表
遍历数组,一个一个放到哈希表中,最后统计出现最高的次数,返回即可
- class Solution {
- public int majorityElement(int[] nums) {
- int key = nums[0];//次数出现最多的数
- int maxValue = -1;//最多的次数
- Map
map = new HashMap(); - for (int i = 0; i < nums.length; i++) {
- if (map.containsKey(nums[i])){
- int num = map.get(nums[i]);
- num++;
- if (num > maxValue){
- maxValue = num;
- key = nums[i];
- }
- map.put(nums[i],num);
- }else {
- map.put(nums[i],1);
- }
-
- }
-
- // System.out.println(key+"出现了:"+maxValue);
- return key;
- }
- }
效果不好
作者:本人
思路:
现将数组排序,然后从前往后遍历着 统计每个数出现的次数,返回出现次数最高的那个
- class Solution {
- public int majorityElement(int[] nums) {
- int key = nums[0];//次数出现最多的数
- int maxValue = -1;//最多的次数
- Arrays.sort(nums);
- int num = 0;
- for (int i = 0; i < nums.length; i++) {
- if (i==0 || nums[i] != nums[i-1] ){//如果是第一次出现
- num = 1;
- }else {//否则是多次出现
- num++;
- if (num > maxValue){
- maxValue = num;
- key = nums[i];
- }
- }
- }
-
- // System.out.println(key+"出现了:"+maxValue);
- return key;
- }
- }
效果提升不少,从13ms 提升到 3ms,但不难看出还是不是最优解
作者:力扣官方
看完力扣的题解,我还是太蠢了,排序之后,直接返回中间的那个数,它肯定是“多数元素”啊!
- class Solution {
- public int majorityElement(int[] nums) {
- Arrays.sort(nums);
- return nums[nums.length / 2];
- }
- }
-
效率再次提高,从3ms提高到了2ms,而且最主要这个思路和代码太优雅了