LeetCode169. 求眾數(分治)
阿新 • • 發佈:2019-02-01
給定一個大小為 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()); } };