第91期-基础技巧:计数 多数元素

1 问题描述

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

示例 1:

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

示例 2:

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

初始代码

from typing import List
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        #在此之间填写代码

print(Solution().majorityElement([3,2,3]))
print(Solution().majorityElement([2,2,1,1,1,2,2]))
View Code

2 解题思路

  • 标签:计数
  • 思路:摩尔投票法
  • 也可以使用哈希表统计,但是这种方式空间复杂度较高。摩尔投票法空间复杂度较低。
  • 摩尔投票法的思路:相同的数字count+1,不同的数字count-1,因为众数>n/2,所以剩到最后的就是众数

#3 解题方法

from typing import List
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        candidate = nums[0]
        count = 1
        for i in range(1, len(nums)):
            if candidate == nums[i]:
                count += 1
            else:
                if count == 0:
                    candidate = nums[i]
                    count = 1
                else:
                    count -= 1
        return candidate

print(Solution().majorityElement([3,2,3]))
print(Solution().majorityElement([2,2,1,1,1,2,2]))
View Code

第1-3,17-18行: 题目中已经给出的信息,运行代码时要根据这些代码进行编辑
第4行: 定义变量candidate并暂时存放nums中的第一个元素
第5行: 定义变量count并赋值为1,用于记录数量
第6行: 使用for循环变量nums中的所有元素
第7-8行: 若当前索引对应的值与candidate的值相等,则count值加一
第9行: 若不相等,则进行下列操作:
第10-12行: 判断count是否等于0,若等于0,则重新定义candidate值为当前索引对应元素,且count值重新等于1
第13-14行: 若不等于0,则count值减一
第15行: 返回candidate,则nums中的多数元素

代码运行结果为:
image.jpg

#技巧讲解

这里用到了基础技巧:计数:摩尔投票法,简单讲解下这个技巧:
摩尔投票法
摩尔投票法的基本思想很简单,在每一轮投票过程中,从数组中找出一对不同的元素,将其从数组中删除。
这样不断的删除直到无法再进行投票,如果数组为空,则没有任何元素出现的次数超过该数组长度的一半。
如果只存在一种元素,那么这个元素则可能为目标元素。


那么有没有可能出现最后有两种或两种以上元素呢?
根据定义,这是不可能的,因为如果出现这种情况,则代表我们可以继续一轮投票。
因此,最终只能是剩下零个或一个元素。

 

posted @ 2022-01-06 20:30  LG03  阅读(35)  评论(0)    收藏  举报