【每週例題】藍橋杯 C++ 多數

山远尽成云發表於2024-04-09

多數元素

題目

多數元素

思路分析一

.第一個想法,暴力遍歷,然後會發現容易超時,那麼更進一步想:雜湊表

  • 使用雜湊表儲存每個數出現的次數,即使用雜湊對映(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];
    }
};

  

相關文章