在求数组最大值时,我们可以使用分治思想,其实也是部分递归思想,设置递归条件,然后开始递归,遇到终止条件再层层返回,只不过每次递归的时候是把原数组分成两份,分别求左右两边的最大值,答案取其中较大那个,若想得到左右两边最大值,需要再次拆分,直到拆成只剩两个或一个元素的数组,用系统max函数求两个元素最大值,再往回合并,合并时只需要计算一次max函数,因为分开的时候也并没有真正拆分数组,只是用双指针代表边界罢了,代码如下:
#include <bits/stdc++.h>
using namespace std;
int div_max(vector<int>& nums,int left, int right)
{
int max_left;
int max_right;
int mid;
if (left==right) return nums[left];
else if (right-left==1) return max(nums[left],nums[right]);
mid=left+((right-left)>>1);
max_left=div_max(nums,left,mid);
max_right=div_max(nums,mid+1,right);
return max(max_left,max_right);
}
int main()
{
vector<int>nums={4,7,6,5,4,3,2};
cout<<div_max(nums,0,6)<<endl;
return 0;
}
代码可直接运行,分治算法比较抽象,需要另外学习这种算法再去理解代码。
再贴一个同时求最大值最小值的代码,只是多了两个变量而已
#include <bits/stdc++.h>
using namespace std;
void max_min(vector<int>&nums,int left, int right, int &fmax, int &fmin)
{
int max_left,max_right,mid,min_left,min_right;
if (left==right)
{
fmin=fmax=nums[left];
return;
}
else if (right-left==1)
{
if (nums[left]>=nums[right])
{
fmax=nums[left];
fmin=nums[right];
}
else
{
fmax=nums[right];
fmin=nums[left];
}
return;
}
mid=left+((right-left)>>1);
max_min(nums,left,mid,max_left,min_left);
max_min(nums,mid+1,right,max_right,min_right);
if (max_left>=max_right) fmax=max_left;
else fmax=max_right;
if (min_left>=min_right) fmin=min_right;
else fmin=min_left;
}
int main()
{
vector<int>nums={4,3,6,5,7,8,2};
int fmax=INT_MAX;
int fmin=INT_MIN;
max_min(nums,0,6,fmax,fmin);
cout<<fmin<<" "<<fmax<<endl;
return 0;
}