【算法系列02】分治法

本文介绍了分治法的思想和应用场景。分治法通过将问题分解为独立的子问题求解,常见应用包括求最大最小元、二分搜索、排序问题(如合并排序)和选择问题。在求解过程中,子问题不断缩小直至可以直接解决,最后合并子问题得到原问题的解。文章详细阐述了这些方法的具体步骤和策略。
摘要由CSDN通过智能技术生成

一、分治法思想:

1.原问题能分解成若干个小的问题,小的问题之间相互独立,且问题的类型相同。

2.子问题足够小的时候可以直接求解。

3.子问题的解能够合成原问题的解

  • 因此多为递归问题。

二、应用

1.求最大最小元

  • 求一组序列的最大最小元,能把长的序列分成两段短的序列。分别求出两段序列的最大值和最小值,再进行比较后合成整个序列的最大值和最小值。
  • 极限就是分到最后序列就剩一个元素或者两个元素了,就可以直接得出最大值和最小值再向上合并。
#include <bits/stdc++.h>
using namespace std;
int L[100];
int n;
int MAX(int a,int b){
   return a>b?a:b;}
int MIN(int a,int b){
   return a>b?b:a;}

//函数无法返回两个值就在一起就行打包了
typedef struct
{
   
    int max;
    int min;
}T;

//关键代码
T MAXMIN(int i,int j)
{
   
    if(i==j)//序列只剩下一个元素
    {
   
        T t;
        t.max=t.min=L[i];
        return t;
    }
    else if(i+1==j)//序列剩下两个元素
    {
   
        T t;
        t.max=MAX(L[i],L[j]);
        t.min=MIN(L[i],L[j]);
        return t;
    }
        else//序列长度大于2继续分割序列
        {
   
            T t;
            //递归方程
            t.max=MAX(MAXMIN(i,(i+j)/2).max,MAXMIN((i+j)/2+1,j).max );
            t
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值