Majority Element [LeetCode 169]

Description


Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

Analysis


最簡單的方法就是計算每個數出現的次數,當統計到一個數出現的次數大於n/2,那麼就輸出這個數。時間複雜度爲O(n)。

但由於我是選擇的是Divide and Conquer這個topic,所以我嘗試用分治的思想解決這個問題。

分治法的思想:

  • 將大的問題分解爲小的子問題,但子問題和大問題本質上爲同一問題。
  • 遞歸解決這些子問題。
  • 將子問題的解答合併獲得大問題的解答。

假設輸入的是一個長度爲n的vector,我們可以從中間把它分成兩半,分別求出它們中出現次數最多的數。這兩半也可以繼續分解,分解到僅剩下一個數時停止。這就是一個把大問題分解爲小的子問題的過程,我們要做的仍然是求出出現次數最多的數,但由於不斷的分解,最後只剩下一個數時,這個數這個子問題中出現次數最多的數了。
這裏寫圖片描述

Answer


class Solution {
public:
    int majorityElement(vector<int>& nums) {
        return (majorpart(nums, 0, nums.size()-1));
    }
private:
    int majorpart(vector<int>& nums, int left, int right) {
        if (left == right) return nums[left];
        int mid = left + ((right - left)/2);

        //遞歸解決子問題
        int leftpart = majorpart(nums, left, mid);
        int rightpart = majorpart(nums, mid + 1, right);

        //cout << leftpart << ' ' << rightpart << endl;

        //將子問題的解答合併獲得大問題的答案
        if (leftpart == rightpart) return leftpart;
        else {
            int a = count(nums.begin() + left, nums.begin() + right + 1, leftpart);
            int b = count(nums.begin() + left, nums.begin() + right + 1, rightpart);
            return a>b? leftpart:rightpart;
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章