1. 程式人生 > >LeetCode169. 求眾數(分治)

LeetCode169. 求眾數(分治)

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

你可以假設陣列是非空的,並且給定的陣列總是存在眾數。

示例 1:

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

示例 2:

輸入: [2,2,1,1,1,2,2]
輸出: 2
    本題用到分治的演算法,難點就在於如何分?如何治?遞迴和分治是難兄難弟。這裡就用到了遞迴和二分查詢。一個數組分為左邊右邊兩個陣列,如果這兩個陣列的眾數相同,那麼這個數就是上一層遞迴陣列的眾數。不同的話,就看左右兩邊陣列的眾數,誰在原陣列中出現的次數最多,就是題目的解。
class Solution {
public:
    int mode(vector<int>& nums, int begin, int end)//分治,用遞迴
    {
        if (begin == end)   //退出遞迴的條件即題目的解
            return nums[begin];
        else
        {
            int mid = (begin + end) / 2;
            int lift = mode(nums, begin, mid);  //把陣列分為左右兩邊,找出左邊的眾數,
            int right = mode(nums, mid+1, end); //再找出右邊的眾數,在進行比較
            
            if (lift == right)//左右兩邊眾數相等,這個數即題目的解
                return lift;
            else    //兩邊眾數不相等,即測出兩邊眾數出現的次數,引數多的就為題目的解
            {
                int liftcount(0);
                int rightcount(0);
                
                for (auto data : nums)
                {
                    if (lift == data)
                        liftcount++;
                    
                    if (right == data)
                        rightcount++;
                }
                
                if (liftcount > rightcount)
                    return lift;
                else
                    return right;
            }
        }
    }
    
    int majorityElement(vector<int>& nums)
    {
        return mode(nums, 0, nums.size());
        
    }
};