169多數元素(摩爾投票法、哈希表)

1、題目描述

給定一個大小爲 n 的數組,找到其中的多數元素。多數元素是指在數組中出現次數大於 ⌊ n/2 ⌋ 的元素。

你可以假設數組是非空的,並且給定的數組總是存在多數元素。

2、示例

輸入: [2,2,1,1,1,2,2]
輸出: 2

3、題解

解法一:

基本思想:Boyer-Moore投票法,時間複雜度O(n)空間複雜度O(1)。從第一個數開始count=1,遇到相同的就加1,遇到不同的就減1,減到0就重新換個數開始計數,最終找到超過半數的那個。

這題一開始想到就是哈希表和排序法,但都無法做到時間複雜度O(n)空間複雜度O(1),但這種題一定有一種最佳算法,抓住問題的最大特徵,要找的那個數在nums中超過半數。

類似玩一個諸侯爭霸的遊戲,數組順序就是各諸侯派兵幹仗的順序,其中有一個諸侯人口超過總人口一半以上,並且每個人口出去幹仗都能一對一同歸於盡。找出最後活下來的諸侯國。最差所有人都聯合起來對付最大人口諸侯國,或者其他國家也會相互攻擊,最後能剩下的必定是人口最多的諸侯國。

解法二:

基本思想:哈希表,時間複雜度O(n)空間複雜度O(n)

#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_map>
using namespace std;
class Solution {
public:
	int majorityElement(vector<int>& nums) {
		//基本思想:Boyer-Moore投票法,時間複雜度O(n)空間複雜度O(1)
		//這題一開始想到就是哈希表和排序法,但都無法做到時間複雜度O(n)空間複雜度O(1),但這種題一定有一種最佳算法
		//抓住問題的最大特徵,要找的那個數在nums中超過半數
		//從第一個數開始count=1,遇到相同的就加1,遇到不同的就減1,減到0就重新換個數開始計數,最終找到超過半數的那個
		int candidate = nums[0];
		int count = 1;
		for (int i = 1; i < nums.size(); i++)
		{
			if (nums[i] == candidate)
				count++;
			else
			{
				count--;
				if (count == 0)
				{
					candidate = nums[i];
					count = 1;
				}
			}
		}
		return candidate;
	}
};
class Solution1 {
public:
	int majorityElement(vector<int>& nums) {
		//基本思想:哈希表,時間複雜度O(n)空間複雜度O(n)
		unordered_map<int, int> HashMap;
		int res, cnt = 0;
		for (auto v : nums)
		{
			++HashMap[v];
			if (HashMap[v] > cnt)
			{
				res = v;
				cnt = HashMap[v];
			}
		}
		return res;
	}
};
int main()
{
	Solution solute;
	vector<int> nums = { 2,2,1,1,1,2,2 };
	cout << solute.majorityElement(nums) << endl;
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章