多数元素II-力扣229-java

目录

 

一、题目描述

二、运行结果

三、解题思路

四、代码


一、题目描

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

示例 1:

输入:nums = [3,2,3]
输出:[3]
示例 2:

输入:nums = [1]
输出:[1]
示例 3:

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

来源:力扣(LeetCode)

二、运行结果

三、解题思路

这里给出了两种方式,两种方式都有一个共同点:就是采用一个哈希表来统计每个数字出现的次数,然后判断出现的次数是否超过n/3。

第一种方式是在将元素加入哈希表的时候就进行判断出现次数是否已经超过n/3,只需遍历一遍输入数组,不用再另外遍历哈希表;

第二种方式是先全部统计完出现次数(暂时不判断是否超过n/3),统计完后在遍历哈希表,找出出现次数超过n/3的数字。

四、代码

//只遍历一趟输入数组,不用遍历哈希表
class Solution {
    public List majorityElement(int[] nums) {
        List ans = new ArrayList<>();
        int n = nums.length;
        int t = n / 3;
        Map frequent = new HashMap<>();//每个数字出现次数
        for(int num : nums){
            if(frequent.containsKey(num)){
                int val = frequent.get(num);
                if(val == -1)    //表示已经加入到答案中
                    continue;  
                if(val+1 > t){   //出现次数超过n/3
                    ans.add(num);
                    frequent.replace(num, -1);   //表示已经加入到答案中
                } else {
                    frequent.replace(num, val+1);//次数加1
                }
                    
            } else {
                frequent.put(num, 1); //该数字第一次出现
                if(t < 1){   //输入数组中元素个数小于3
                    ans.add(num);
                    frequent.replace(num, -1);
                } 
            }
        }
        return ans;
    }
}
//遍历一遍输入数组,再遍历一遍哈希表
class Solution {
    public List majorityElement(int[] nums) {
        List ans = new ArrayList<>();
        int n = nums.length;
        int t = n / 3;
        Map frequent = new HashMap<>();//每个数字出现次数
        for(int num : nums){            
            if(frequent.containsKey(num))
                frequent.replace(num, frequent.get(num)+1);
            else
                frequent.put(num, 1);
        }
        for(int key : frequent.keySet()){
            if(frequent.get(key) > t)
            ans.add(key);
        }
        return ans;
    }
}

你可能感兴趣的:(#,力扣-java,力扣,java,多数元素,哈希表,算法)