多數元素
題目
多數元素
思路分析一
.第一個想法,暴力遍歷,然後會發現容易超時,那麼更進一步想:雜湊表
- 使用雜湊表儲存每個數出現的次數,即使用雜湊對映(HashMap)來儲存每個元素以及出現的次數。對於雜湊對映中的每個鍵值對,鍵表示一個元素,值表示該元素出現的次數
- 加入後,遍歷所有鍵值對,返回最大的鍵
- 也可以在遍歷的同時尋找最大鍵
程式碼一
#include <iostream> #include <vector> #include<map> using namespace std; int majorityElement(vector<int>& nums) { map<int, int>count; int x = 0, votes = 0; //初始化候選多數元素x和票數votes for (int num : nums) { ++count[num]; if (count[num] > votes) { x = num; votes = count[num]; } } return x; } int main() { int n; cin >> n; vector<int> nums(n); for (int i = 0; i < n; i++) { cin >> nums[i]; } cout << majorityElement(nums); return 0; }
放在力扣的答案為:
class Solution { public: int majorityElement(vector<int>& nums) { map<int, int>count; int x = 0, votes = 0; //初始化候選多數元素x和票數votes for (int num : nums) { ++count[num]; if (count[num] > votes) { x = num; votes = count[num]; } } return x; } };
思路分析二
學習數學的時候有一個小知識點:經過單調排序後,下標為陣列一半的元素(下標從 0
開始)一定是眾數。
程式碼二
#include <iostream> #include <vector> #include<algorithm> using namespace std; int main() { int n; cin >> n; vector<int> nums(n); for (int i = 0; i < n; i++) { cin >> nums[i]; } sort(nums.begin(), nums.end()); cout << nums[nums.size() / 2]; return 0; }
放在力扣的答案:
class Solution { public: int majorityElement(vector<int>& nums) { sort(nums.begin(), nums.end()); return nums[nums.size() / 2]; } };