leetCode-Majority Element
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