每日一道算法题--leetcode 169--求众数--python--两种方法

653 阅读1分钟

【题目描述】

【求众数I】

【算法思路】

【方法一】

在不要求时间空间复杂度的情况下,可以采用的方法很多,最简单易懂的一种就是对nums中每个值统计一下数量,如果数量大于nums长度的一半,就直接返回。代码如下:

class Solution(object):
    def majorityElement(self, nums):
        for i in list(set(nums)):
            if nums.count(i)>len(nums)/2:
                 return i

【方法二】

摩尔投票法,是一种多数派想法

1.对于v[i],如果c此时为未知状态,则c=v[i],t=1,递增i。

2.如果c==v[i],++t,递增i。

3.如果c!=v[i],–t,如果t==0,将c置为未知状态,递增i。

4.所有投票处理完毕后,如果c为未知状态,则说明不存在任何候选人的得票数过半,否则重新遍历数组v,统计候选人c的实际得票总数,如果c的得票数确实过半,则c就是最终结果。

就是这个数在nums中出现次数过半,那么不管如何抵消,最终终会使c等于这个众数,t>=1。时间复杂度O(n),空间复杂度O(1),代码如下:

class Solution(object):
    def majorityElement(self, nums):
        m=cm=0
        for n in nums:
            if n==m:
                cm+=1
            elif cm==0:
                m=n
                cm=1
            else:
                cm-=1
        return m