算法-分治法
分治法:将一个难以直接求解的大问题,分成若干个规模较小的子问题。递归的解决这些子问题,然后合并子问题的解,即为原问题的解。其中要求子问题相互独立,并且是与原问题的形式是一样的。
例题1:多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3]
输出:3
示例 2:
输入:[2,2,1,1,1,2,2]
输出:2
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
对于这道题,我们需要知道如果一个数是多数,那就需要它比数组的一半长度大,那么对应的如果将数组一分为二,那这个数在其中的一部分也是多数元素。那么我们就可以将问题分解成多个子问题,使用分治法就可以解决。其中递归的出口就是当子问题足够小到,左右边界相等时,那么子问题的解就是这个数本身。
class Solution {
//计算在le到ri(包括边界)中,目标值的个数
int count(vector<int>& nums,int target,int le,int ri){
int count=0;
for(int i=le;i<=ri;++i){
if(nums[i]==target){
++count;
}
}
return count;
}
int majority_list(vector<int>& nums,int le,int ri){
if(le==ri){
return nums[le];
}
int mid=(le+ri)/2;
int left_majority=majority_list(nums,le,mid);
int right_majority=majority_list(nums,mid+1,ri);
if(count(nums,left_majority,le,ri)>(ri-le+1)/2){
return left_majority;
}
if(count(nums,right_majority,le,ri)>(ri-le+1)/2){
return right_majority;
}
return -1;
}
public:
int majorityElement(vector<int>& nums) {
return majority_list(nums,0,nums.size()-1);
}
};