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;
}
}
};