算法:Majority Element(求众数)

说明

算法:Majority Element
LeetCode地址:https://leetcode.com/problems/majority-element/

题目:
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

Example 1:

Input: [3,2,3]
Output: 3

Example 2:

Input: [2,2,1,1,1,2,2]
Output: 2

解题思路

题意是从数组中找出出现次数最多的数,而且最多的数大于一半 ⌊ n/2 ⌋,步骤如下:
1. 如果数组只有一个数直接返回第一个数,
2. 用HashMap保存key为出现的数字,value为出现次数
3. 跟已经保存的最大出现次数比较,如果大于,则保存最大出现次数,和该数字。
4. 时间复杂度为O(n)

代码实现

import java.util.HashMap;
import java.util.Map;

public class MajorityElement {

    public int majorityElement(int[] nums) {
        if (nums.length == 1) {
            return nums[0];
        }

        int majorityKey = 0;
        int majorityCount = 0;

        Map<Integer, Integer> numCountMap = new HashMap<>();
        for (int num: nums) {
            if (numCountMap.containsKey(num)) {
                numCountMap.put(num, numCountMap.get(num) + 1);
                if (numCountMap.get(num) > majorityCount) {
                    majorityCount = numCountMap.get(num);
                    majorityKey = num;
                }
            } else  {
                numCountMap.put(num, 1);
            }
        }

        return majorityKey;
    }

    public static void main(String[] args) {
        int[] inputNums = {2,2,1,1,1,2,2};
        System.out.println("Output: " + new MajorityElement().majorityElement(inputNums));
    }
}


结果输出

Output: 2

代码执行效率

Runtime: 25 ms, faster than 19.42% of Java online submissions for Majority Element.
Memory Usage: 43.4 MB, less than 20.42% of Java online submissions for Majority Element.

总结

实为考察重复数字出现, 时间复杂度为O(n)。注意:保存最大数据的时候,考虑只有一个数的情况,只有一个数就没有比较,也就是初始数据。

代码下载:
https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/MajorityElement.java

猜你喜欢

转载自blog.csdn.net/zgpeace/article/details/87856036