给定一个大小为 n
的数组 nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3] 输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2] 输出:2
提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
方法一:如果一个数组有大于一半的数相同,那么任意删去两个不同的数字,新数组还是会有相同的性质,即原来的“多数元素”在删除任意两个不同元素后数组中的“多数元素”的值不变
class Solution(object):def majorityElement(self, nums):""":type nums: List[int]:rtype: int"""length=len(nums)#由于一定存在一个长度大于n/2的数k,所以用k对应减去不等于k的值后剩余的数的值还是k(eg:2,2,3用一个2对应减去一个3,剩余的就是k值2),#初始时随便选择数组中的一个数作为k,对数组 进行扫描,当遇到的数与选择的数k相同则times+1,否则减一,当减到零0,将遇到的元素作为新的k值k=nums[0]times=0for i in range(0,length,1):#print(i,":")if nums[i]==k:times+=1elif nums[i]!=k:times-=1if times==0:k=nums[i]times=1#print(k)return k
方法二:
使用哈希映射(HashMap)来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。
我们用一个循环遍历数组 nums 并将数组中的每个元素加入哈希映射中。在这之后,我们遍历哈希映射中的所有键值对,返回值最大的键。我们同样也可以在遍历数组 nums 时候使用打擂台的方法,维护最大的值,这样省去了最后对哈希映射的遍历。
class Solution(object):def majorityElement(self, nums):""":type nums: List[int]:rtype: int"""vals=nums[0]for i in range(0,len(nums)/2+1,1):vals=nums[i]k=nums.count(vals)print(vals,":",k)if k>len(nums)/2:print(len(nums)/2)breakreturn vals