微信搜索:pipi的奇思妙想
解锁更多有趣的动画~
这是一道leetcode上的题目,题目链接戳:多数元素
题目描述
视频带你了解摩尔投票~
摩尔投票是什么?看这个一遍就懂啦!
解法
这道题的解法有很多,在这里解释一种比较特别的方法:摩尔投票法。
这里有个小视频说明了摩尔投票~
题目中我们需要查找的数字超过数组长度的一半,也就是说,要查找的数字target的个数会超过其他数字个数。
假设不同数字相互抵消,那么最后剩下的数字,就是我们要找的多数元素。
我们可以把这个过程打个比方,比如现在多军对峙,假设阵营A士兵人数比其他方的人数都多,阵营A士兵能以一杀一,那么只要阵营A士兵不杀自己人(相同数字),去杀不同阵营的人(不同数字),那么最后剩下的那些士兵,就是阵营A的士兵。
因此我们可以假设数组的第一个数字为target,然后遍历数组,我们尝试用计数cnt模拟这个抵消的过程,规则如下:
1)当数组中的元素与假设的target不相等时,计数cnt减1,即模拟不同数字相互抵消;
2)假设数组中的元素与假设的target相等时,计数cnt加1;
3)当计数cnt等于0时,说明在当前遍历到的数组元素中,当前假设的target与其他数字相互抵消(个数相同),所以我们重新假设下一个遍历的数组元素为target,继续上面过程。
4)当遍历完数组后,target为所求数字。
python版本代码如下
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return
targetnum = nums[0]
cnt = 0
for n in nums:
if targetnum == n:
cnt += 1
else:
cnt -= 1
if cnt == -1:
targetnum = n
cnt = 0
return targetnum
时间复杂度为O(n),空间复杂度为O(1)。
喜欢的话就点个赞吧~
你的关注/点赞/转发是我持续创作的最大动力~
用动画说技术
偶尔分享生活
微信搜索:pipi的奇思妙想
关注我解锁更多有趣的视频~