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的数组,找到其中的“多数元素”。多数元素指的是出现次数超过 ⌊ n/2 ⌋ 次的元素。
假定数组非空,且给定的数组中一定存在多数元素。
思路:
1、暴力求解,用一个字典记录所有出现过的元素及其个数。由于题目中说多数元素一定存在,当找到某个元素出现次数大于n/2时即可停止。
class Solution(object):
def majorityElement(self, nums):
dicts = {}
for i in nums:
dicts [i] = dicts .get(i, 0) + 1// 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。
if dicts [i] > len(nums)/2:
return i
2、先对数组进行排序,因为多数元素一定存在,且个数超过总个数的一半,那么排序后最中间的那个元素一定是多数元素。
class Solution(object):
def majorityElement(self, nums):
nums.sort()
return nums[len(nums)/2]
3、分治法:
每次将数组分成左右两半,在两半中分别找出现次数最多的元素,若找到的两个元素相同则此元素即为所求,否则在整个数组中分别计算这两个元素出现的次数,取较大的那个。
class Solution(object):
def majorityElement(self, nums):
return self.major(nums,0,len(nums)-1)
def major(self,ori_nums,left,right):
if left==right:
return ori_nums[left]
mid = (left+right)/2
major_l=self.major(ori_nums,left,mid)
major_r=self.major(ori_nums,mid+1,right)
if major_l==major_r:
return major_l
if ori_nums[left: right+1].count(major_l) > ori_nums[left: right+1].count(major_r):
return major_l
else:
return major_r