LeetCode 229. Majority Element II

来源:互联网 发布:linux mint 18 kde下载 编辑:程序博客网 时间:2024/06/03 11:18

问题描述

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

问题分析

给定一个数组,当前数组中所有的出现次数超过1/3的值。做法了之前的求超过一半的值的做法有些类似,但是有不一样。这里需要设置两个值,同时得到的结果需要在一次进行判断是否超过了1/3.

代码实现

public List<Integer> majorityElement(int[] nums) { int firstNum = 0, firstCout = 0;        int secondNum = 0, secondCout = 0;        for (int i = 0; i < nums.length; i++) {            if (firstCout!= 0 && nums[i]== firstNum){                firstCout++;            }else  if (secondCout!= 0&& nums[i]== secondNum){                secondCout++;            }else if (firstCout == 0){                firstCout++;                firstNum= nums[i];            }else if (secondCout == 0){                secondCout++;                secondNum = nums[i];            }            else {                firstCout--;                secondCout--;            }        }        List<Integer> result = new ArrayList<Integer>();        if (firstCout != 0) {            if (checkLegal(nums, firstNum)) {                result.add(firstNum);            }        }        if (secondCout != 0) {            if (checkLegal(nums, secondNum)) {                result.add(secondNum);            }        }        return result;    }    /**     * 检查当前的值是否是真正的大于1/3     *     * @param nums     * @param secondNum     * @return     */    private boolean checkLegal(int[] nums, int secondNum) {        int count = 0;        for (int num : nums) {            if (num == secondNum) {                count++;            }        }        int target = nums.length / 3;        return target < count;    }
原创粉丝点击