求数组最大值最小值——分治思想

在求数组最大值时,我们可以使用分治思想,其实也是部分递归思想,设置递归条件,然后开始递归,遇到终止条件再层层返回,只不过每次递归的时候是把原数组分成两份,分别求左右两边的最大值,答案取其中较大那个,若想得到左右两边最大值,需要再次拆分,直到拆成只剩两个或一个元素的数组,用系统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;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值