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是对应的个数
对于这个函数的使用可以参考()