LeetCode 229. Majority Element II

简介: 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。

v2-523ecded759f29a6471f2f3b307391eb_1440w.jpg

Description



Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times.


Note: The algorithm should run in linear time and in O(1) space.


Example 1:

Input: [3,2,3]

Output: [3]


Example 2:

Input: [1,1,1,3,3,2,2,2]

Output: [1,2]


描述



给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。


示例 1:

输入: [3,2,3]

输出: [3]


示例 2:

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

输出: [1,2]


思路



  • 这道题使用Boyer–Moore majority vote algorithm算法.
  • 我们另num1为第一个候选数字,num2为第二个候选数字,count1表示num1获得的投票数,count2表示num2的投票数.
  • 基本操作过程如下:1.如果当前数字等于num1,我们让count1加一;2.如果当前数字等于num2,我们让count2加一;3,如果当前元素不等于num1且不等于num2,如果count1为0,我们把当前元素付给num1,并将count1置为1;4.如果当前元素不等于num1且不等于num2,如果count2为0,我们把当前元素付给num2,并将count2置为1 5. 否则(即如果当前元素不等于num1且不等于num2,并且count1和count2)我们将count1和count2自减一次.
  • 可能出现了大于len(nums)//3次的元素只可能出现在num1和num2中,我们检查num1是否出现了大于len(nums)//3次,num2是否出现了大于len(nums)//3次.
  • 返回出现次数大于len(nums)//3次的元素.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-01-31 11:47:21
# @Last Modified by:   何睿
# @Last Modified time: 2019-01-31 12:39:14
class Solution:
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        if not nums: return []
        # 候选参数1,候选参数2,初始化可以为任意值,只要保证num1 != num2 即可
        num1, num2 = 0, 1
        count1, count2 = 0, 0
        for item in nums:
            # 如果当前元素和第一个元素相等,第一个元素的投票数(权重)加一
            if item == num1:
                count1 += 1
            # 如果当前元素和第二个元素相等,第二个元素的投票数(权重)加一
            elif item == num2:
                count2 += 1
            # 如果第一个元素还没有被投票,将第一个元素置为当前元素
            # 并且将其权重置为1
            elif count1 == 0:
                num1 = item
                count1 = 1
            # 如果第二个元素没有被投票,将第二个元素置为当前元素
            # 并且将其权重置为1
            elif count2 == 0:
                num2 = item
                count2 = 1
            # 否则说明候选元素1和元素2存在且不和当前元素相等,
            # 则元素1和元素2的投票数(权重)减一
            else:
                count1 -= 1
                count2 -= 1
        # 满足条件的元素只可能出现在num1和num2中,我们检查这两个元素是否出现了超过len(nums)//3次
        return [num for num in (num1, num2) if nums.count(num) > len(nums) // 3]


源代码文件在这里.


目录
相关文章
Leetcode 230. Kth Smallest Element in a BST
先来看下二叉搜索树的性质,对于任意一个非叶子节点,它的左子树中所有的值必定小于这个节点的val,右子树中所有的值必定大于或等于当前节点的val。 这条性质就保证了如果我们对二叉搜索树做中序遍历,中序遍历的结果肯定是有序的。对于此题而言,我们只需要拿到中序遍历结果,然后返回第k个即可,时间复杂度是O(n)。
229 1
|
Python
LeetCode 378. Kth S Element in a Sorted Matrix
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。 请注意,它是排序后的第k小元素,而不是第k个元素。
302 0
LeetCode 378. Kth S Element in a Sorted Matrix
|
索引
LeetCode 162. Find Peak Element
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。 数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
308 0
LeetCode 162. Find Peak Element
|
算法 Python
LeetCode 169. 多数元素 Majority Element
LeetCode 169. 多数元素 Majority Element
LeetCode 215. Kth Largest Element in an Array
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
300 0
|
Java C++
LeetCode之Remove Element
LeetCode之Remove Element
259 0
LeetCode之Next Greater Element I
LeetCode之Next Greater Element I
252 0
|
容器
LeetCode 169 Majority Element(主要元素)(vector、map)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50504698 翻译 给定一个长度为n的数组,找出主要的元素。
1012 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
514 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
595 2

热门文章

最新文章