169 Majority Element

求给定数组中出现次数超过一半的数:https://leetcode.com/problems/majority-element/description/

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        return nums[nums.size()/2];
    }
};

解答区给出了本问题的几种不同的解法:

1. Brute Force

穷举,用数组每个元素与后面元素比较,时间复杂度 O(n2) O ( n 2 )

2. HashMap

利用哈希图特性,存储并记录重复元素,最后找到出现次数最多的数,时间复杂度 O(n) O ( n )

3. Sorting

排序后取中间的数

4. Randomization

没看懂…代码如下:

import random

class Solution:
    def majorityElement(self, nums):
        majority_count = len(nums)//2
        while True:
            candidate = random.choice(nums)
            if sum(1 for elem in nums if elem == candidate) > majority_count:
                return candidate    

5. Divide and Conquer

分治算法,将数组一分为二,递归分别找到前一半与后一半中的最多元素a与b,之后将出现三种情况:
* a=b a = b :a即为众数
* ab a ≠ b :遍历整个数组,比较a、b出现次数。
时间复杂度可以通过master theorem方法计算

6. Boyer-Moore Voting Algorithm

[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]
思想是取第一个元素作为候选数,同时初始化count变量为0。向后遍历数组,与候选数相同则 count+1 c o u n t + 1 ,不同则 count1 c o u n t − 1 。当count再次为0是,重新选取下一个元素作为候选数。遍历数组后,最后的候选数即为Majority Element。

class Solution:
    def majorityElement(self, nums):
        count = 0
        candidate = None

        for num in nums:
            if count == 0:
                candidate = num
            count += (1 if num == candidate else -1)

        return candidate
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值