169求众数 简单 分治算法
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
1.方法一遍历:首先想到的方法是将数组的所有元素遍历,计算每个元素出现的次数,最后返回出现次数最多的元素,即为众数。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
n = len(nums)
#出现次数
count = 0
for i in range(n):
for j in range(n):
if(nums[i]==nums[j]):
count+=1
if (count>n/2):
return (nums[i])
一开始不停报错因为我把count+=1写成了count++,但是python中是没有自增自减的,原因参考()
python中的数字类型是不可变数据。意思说的是数字类型数据在【内存】中是不会发生改变,当变量值发生改变时,会新申请一块内存赋值为新值,然后将变量指向新的内存地址。
a = 10
id(a)
140698656902112a = a+1
id(a)
140698656902144
可以看到当a的值发生改变时,a指向的内存地址也发生了改变。而在C语言中,a指向的内存地址并不会发生改变,而是改变内存的内容。
从这里就可以理解为什么”自增”为什么在python中不存在。++代表改变了对象本身,而python中数字类型是不可变,所以自增是不存在的。
答案写的要简洁许多
2.方法二排序法:观察题目可知,题目中对众数的出现次数进行了限定,大于(n/2),所以如果将数组排序无论升序降序,第n/2个位置的数一定是众数,n可能为奇数n/2要取整。
感觉这种方法很巧妙哎(参考题解)
class Solution:
def majorityElement(self, nums: List[int]) -> int:
# 将列表直接排序
nums.sort()
index=len(nums)//2
return nums[index]
3.方法三哈希表统计数组中每个元素出现的个数,元素为键,元素个数为键值,最后返回键值最大的元素即可
class Solution:
def majorityElement(self, nums: List[int]) -> int:
counts = collections.Counter(nums)
return max(counts.keys(),key=counts.get)
collections.Counter这个函数真的是非常有用了,是用来统计个数的~返回的是一个dict,key是各个元素,value是对应的个数
对于这个函数的使用可以参考()