1. 程式人生 > >leetCode-Majority Element

leetCode-Majority Element

fcm 數組 jsb 大於 sdn solution margin ram value

Description:
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.

My Solution:

class Solution {
    public int majorityElement(int
[] nums) { Map<Integer,Integer> map = new HashMap<Integer,Integer>(); int len = nums.length; for(int i = 0;i < len;i++){ map.put(Integer.valueOf(nums[i]),map.get(nums[i]) == null?Integer.valueOf(1):map.get(nums[i]) + 1); } int result = 0;
for(Integer i : map.keySet()){ if(map.get(i) > Math.ceil(len/2)){ result = i; } } return result; } }

Better Solution1:

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}

技術分享圖片
如圖所示,當數組nums元素個數為奇數時,如果Majority Element(最大數目元素,以下簡稱ME)最小,那麽圖中第一行數組中下劃線即為ME在nums中的分布,如果Majority Element(最大數目元素,以下簡稱ME)最大,那麽圖中第一行數組中上劃線即為ME在nums中的分布。當數組nums元素個數為偶數時,如果Majority Element(最大數目元素,以下簡稱ME)最小,那麽圖中第一行數組中下劃線即為ME在nums中的分布,如果Majority Element(最大數目元素,以下簡稱ME)最大,那麽圖中第一行數組中上劃線即為ME在nums中的分布。如果ME介於最大與最小之間,那麽ME的分布介於兩條直線之間。而無論何種情況,n2始終在ME的分布範圍內。

Better Solution2:

class Solution {
    public int majorityElement(int[] nums) {
        int count = 0;
        Integer candidate = null;

        for (int num : nums) {
            if (count == 0) {
                candidate = num;
            }
            count += (num == candidate) ? 1 : -1;
        }

        return candidate;
    }
}

總結:因為ME滿足個數大於num數組個數的一半,可以把nums數組想象成分布了兩類元素,一類為ME,一類非ME,count始終大於0(實際不是這樣,count一般會在大於0和等於0之間波動,不過這樣想易於理解),而candidate就可以定位到ME。

版權聲明:本文為博主原創文章,未經博主允許不得轉載。

leetCode-Majority Element