[LeetCode练习]229. 求众数 II

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

说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。

示例 1:

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

示例 2:

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

方法一: 

思路:1、将值和出现的次数存到map中,最后遍历map

public List<Integer> majorityElement(int[] nums) {
    if (nums==null ){
        return null;
    }
    int k = nums.length/3;
    Map<Integer,Integer> map = new HashMap<>();
    List<Integer> list = new ArrayList();
    for (int i=0;i<nums.length;i++) {
        if (map.containsKey(nums[i])) {
            int count = map.get(nums[i])+1;
            map.put(nums[i],count);
        } else {
            map.put(nums[i],1);
        }
    }
    map.entrySet().forEach(e->{
        if (e.getValue()>k) {
            list.add(e.getKey());
        }
    });
    return list;
}

方法二:

思路:摩尔投票法 https://mabusyao.iteye.com/blog/2223195

代码:

public List<Integer> majorityElement3(int[] nums) {
    int value1 = Integer.MIN_VALUE + 1, value2 = Integer.MIN_VALUE + 1, count1 = 0, count2 = 0;
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] == value1 && count1 >= 0) {
            count1++;
        } else if (nums[i] == value2 && count2 >= 0) {
            count2++;
        } else if (count1 == 0) {
            value1 = nums[i];
            count1 = 1;
        } else if (count2 == 0) {
            value2 = nums[i];
            count2 = 1;
        } else {
            count1--;
            count2--;
        }
    }
    count1 = 0;
    count2 = 0;
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] == value1) {
            count1++;
        }
        if (nums[i] == value2) {
            count2++;
        }
    }
    List<Integer> result = new ArrayList<Integer>();
    if (count1 > (nums.length / 3)) {
        result.add(value1);
    }

    if (count2 > (nums.length / 3)) {
        result.add(value2);
    }
    return result;
}

猜你喜欢

转载自blog.csdn.net/lbh199466/article/details/86563595
今日推荐