题目:多数元素
解法一(哈希表):
第一次遍历将数组中的元素存入哈希表,nums自身的数值作为键,出现次数作为值
之后再通过一次遍历找出表中值大于n/2对应的键,作为 _多数元素 _返回
1int majorityElement(vector<int>& nums)
2 {
3 int sz = nums.size();
4 int res;
5 std::unordered_map<int, int> um;
6 for(int i = 0; i < sz; i++)
7 {
8 if(um.find(nums[i]) == um.end())
9 um[nums[i]] = 1;
10 else
11 um[nums[i]]++;
12 }
13 for(auto num : nums)
14 {
15 if(um[num] > static_cast<float>(sz / 2))
16 res = num;
17 }
18 return res;
19 }
解法二:
这里借用一下灵神的比喻:169. 多数元素 - 力扣(LeetCode)
用「擂台赛」打比方:
想象一众武林高手比武,谁会笑到最后?
擂主登场:nums[0] 成为初始擂主,生命值为 1。
挑战者出现:遍历后续元素,作为挑战者。
比武:如果挑战者与擂主属于同一门派(值相同),那么擂主生命值加 1,否则擂主生命值减 1。
擂主更迭:如果比武后,擂主生命值降为 0(同归于尽),那么下一个挑战者成为新的擂主,生命值为 1。
最后在擂台上的那人,便是武林盟主(绝对众数)。
1int majorityElement(vector<int>& nums)
2{
3 int res = 0, hp = 0;
4 for(int x : nums)
5 {
6 if(hp == 0)
7 {
8 res = x;
9 hp = 1;
10 }
11 else
12 hp += res == x ? 1 : -1;
13 }
14 return res;
15}