数组中出现次数超过一半的数字——剑指 Offer 39

文章目录

      • 题目描述
      • 法一 哈希表
      • 法二 摩尔投票

题目描述

数组中出现次数超过一半的数字——剑指 Offer 39_第1张图片

法一 哈希表

使用哈希映射(HashMap)来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。

class Solution {
public:
    int majorityElement(vector<int>& nums){
		unordered_map<int, int> res;
		int n = nums.size();
		int cnt=n/2, maj=0;
		for(auto&num:nums){
			++res[num];
			if(res[num]>cnt){
				maj=num;
			}
		}
		return maj;
	}
};

数组中出现次数超过一半的数字——剑指 Offer 39_第2张图片

法二 摩尔投票

核心理念为 票数正负抵消 。此方法时间和空间复杂度分别为 O(N) 和 O(1)

数组中出现次数超过一半的数字——剑指 Offer 39_第3张图片
数组中出现次数超过一半的数字——剑指 Offer 39_第4张图片

int majorityElement(vector<int>& nums){
		int vote=0, x=0;
		for(auto&num:nums){
			if(vote==0) x=num;
			vote += num==x? 1 : -1;
		}
		return x;
	}

数组中出现次数超过一半的数字——剑指 Offer 39_第5张图片

你可能感兴趣的:(算法刷题笔记,算法,哈希算法,链表,数据结构,leetcode,c++)