【LeetCode14】求众数

时间:2022-06-25
本文章向大家介绍【LeetCode14】求众数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
【LeetCode01】找到字符串中最长的回文字串

【LeetCode02】找出不含重复字符的 最长子串 的长度

【LeetCode03】查找字符串最长公共前缀

【LeetCode04】最接近的三数之和

【LeetCode05】删除排序数组中的重复项

【LeetCode06】反转字符串中的单词

【LeetCode07】旋转矩阵(一)

【LeetCode08】字符串转换整数

【LeetCode09】有效的括号

【LeetCode10】盛最多水的容器

【LeetCode11】反转字符串

【LeetCode12】合并两个有序数组

【LeetCode13】整数反转

? 今日挑战

给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在众数。

示例 1:

输入: [3,2,3]输出: 3

示例 2:

输入: [2,2,1,1,1,2,2]输出: 2

先思考一下,后面我会给出一个解题思路~?

Way 1

第一种方法最直接,直接使用Python的库collections里的方法Counter,直接统计所有元素出现的次数,返回最大次数的元素即可。

Python实现:

def majorityElement(nums):
    counts = collections.Counter(nums)
    print(counts)
    return max(counts.keys(), key=counts.get)

Way 2

第二种方法这里介绍一下Boyer-Moore 投票算法。

1 )因为题目中对于众数的定义为出现次数大于 ⌊ n/2 ⌋ 的元素 ,因此我们把众数记为 +1,把其他数记为 -1,将它们全部加起来,显然和大于 0 。

2 )这里,我们把第一次出现的数字,当做为当前的候选者,循环迭代,如果出现不一样的数字,投票器减1,出现相同的数字,投票器加1,如果投票器为0,重新挑选当前位置的数字作为新的候选者,从当前的位置开始,继续迭代。

可以看下面的例子:

[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]

首先,下标为 0 的 7 被当做众数的第一个候选。在下标为 5 处,计数器会变回0 。所以下标为 6 的 5 是下一个众数的候选者。由于这个例子中 7 是真正的众数,所以通过忽略掉前面的数字,我们忽略掉了同样多数目的众数和非众数。因此, 7 仍然是剩下数字中的众数。

[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 5, 5, 5, 5]

现在,众数是 5 (在计数器归零的时候我们把候选从 7 变成了 5)。此时,我们的候选者并不是真正的众数,但是我们在 遗忘 前面的数字的时候,要去掉相同数目的众数和非众数(如果遗忘更多的非众数,会导致计数器变成负数)。

因此,上面的过程说明了我们可以放心地遗忘前面的数字,并继续求解剩下数字中的众数。最后,总有一个后缀满足计数器是大于 0 的,此时这个后缀的众数就是整个数组的众数。

Python实现:

def Moore(nums):
    count=0
    target=None
    for i in range(len(nums)):
        print(i)
        print(target)
        if target==None or count==0: 
            target=nums[i]
            count+=1
        else:
            if target == nums[i]: count+=1
            else: count-=1
    return target