排序 | 哈希表 | 摩尔投票:力扣169. 多数元素(也就是求众数)

1、题目描述:

排序 | 哈希表 | 摩尔投票:力扣169. 多数元素(也就是求众数)_第1张图片

2、题目:

可以同时做一下力扣面试题 17.10. 主要元素
方法1:排序
因为众数必定存在,所以可以排序后,返回中间值,中间值一定是众数。
Python:

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        #排序
        nums.sort()
        return nums[len(nums) // 2]

C++:

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

方法2:哈希表
先构建哈希表,key是num,value值是出现的次数,
然后再次遍历哈希表,找到众数,返回
Python:

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        #哈希表
        hashmap = {}
        for num in nums:
            if num in hashmap:
                hashmap[num] += 1
            else:
                hashmap[num] = 1
        for key in hashmap:
            if hashmap[key] > len(nums) // 2:
                return key

C++:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        //哈希表
        unordered_map<int,int> counts;
        int res = 0,cnt = 0;
        for (int num : nums){
            ++counts[num];
            if (counts[num] > cnt){
                res = num;
                cnt = counts[num];
            }       
        }  
        return res;
    }
};

方法3:摩尔投票法
思路:

摩尔投票算法是基于这个事实:每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字
或几个相同的数字,就是出现次数大于总数一半的那个。
设置两个变量:计数count,所求结果res
一次遍历:
	如果计数等于0:
		就从1开始重新计数
		更新res为当前值
	如果当前值等于res:#说明有重复的数,
		让count + 1
	否则:
		让count - 1
最后返回res就是最终的结果。

Python:

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        # 摩尔投票法
        res,count = nums[0],1
        for i in range(1,len(nums)):
            if count == 0:
                res = nums[i]
                count = 1
            elif res == nums[i]:
                count += 1
            else:
                count -= 1
        return res

C++:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        // 摩尔投票
        int candidate = nums[0],count = 1;
        for(int i = 1;i < nums.size();++i){
            if (count == 0){
                candidate = nums[i];
                count = 1;
            }else if (candidate == nums[i]){
                ++count;
            }else{
                --count;
            }
        }
        return candidate;
    }
};

3、复杂度分析:

方法1:
时间复杂度:O(NlogN)
空间复杂度:O(1)
方法2:
时间复杂度:O(N)
空间复杂度:O(N)
方法3:
时间复杂度:O(Nl)
空间复杂度:O(1)

你可能感兴趣的:(LeetCode高频面试题)