分治递归法求数组最大值、数组二分查找

完全理解递归与分治:3种方法求数组最大值为例子 递归,分治是一种常见迭代方法。在二叉树遍历,线性表中遍历十分常见。递归、分治最核心的思想是 递推。 从外层–》内层,压栈,使得计算规模不断减小。 从内层–》外层,出栈,需要把计算结果传递给外层,做计算。编写代码请问下自己下面几个问题: 1、传入的参数是什么,是作为缓冲来接收吗, 2.、返回的结果是什么,这个结果需要带入到外层递推公式中。 3、外层函数主要包括: 递 阅读详情

问题如下:

在这里插入图片描述采用递归分治法,类似于二分查找,找左边最大值和右边最大值,然后比较,返回比较大的那一个。递归的出口是当左下标>=右下标时,返回当前元素。
例:if(i>=j) return a[i];
不多说了,思路比较简单,直接堆代码

#include <iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
//分治法求一维数组的最大值问题
int GetMax(int a[],int left,int right)
{
    //只有一个元素的时候,其就是最大值,递归出口
    if(left>=right) return a[left];
    //递归体
    else
    {
        int middle = (right+left)/2;
        //递归找左边部分数组的最大值
        int left_max = GetMax(a,left,middle);
        //递归找右边部分数组的最大值,从middlej+1开始
        int right_max = GetMax(a,middle+1,right);
        if(left_max>right_max)  return left_max;
        else return right_max;
    }
}
int GetMax2(int *a,int lt,int rg)
{
    if(lt>=rg) return a[lt];
    else{
        int mid=(lt+rg)/2;
        if(GetMax2(a,lt,mid)>GetMax2(a,mid+1,rg))  
            return GetMax2(a,lt,mid);
        else 
            return GetMax(a,mid+1,rg);
    }
}
int main()
{
    int n;
    cin>>n;
    int a[n];
    for(int i=0;i<n;i++)
        cin>>a[i];
    cout<<GetMax2(a,0,n-1)<<endl;
    return 0;
}

在这里插入图片描述

二分查找

二分查找法(折半查找法):查找数组中是否包含指定元素。如果包含指定元素,则返回指定元素的index(从0开始);如果不包含指定元素,则返回-1;
前提:数组中的元素必须是有序的。且可以通过下标索引。
将被查找的数组分为三部分,依次是中值前、中值、中值后,将指定元素和数组的中值进行比较,如果指定元素小于中值则在(中值前)中找,如果指定元素大于中值则在(中值后)中找,如果指定元素等于中值则直接返回。依次查找后,如果不包含指定元素,则返回-1;
注:中值即数组中间位置的值。

#include <iostream>
using namespace std;
int a[101];
int BinarySearch(int *a,int key,int left,int right)
{
    //递归出口
    if(left>right) return -1;//未找到
    
    int mid=(left+right)/2;
    if(a[mid]==key) return mid;//找到了,返回当前下标
    else if(left<=right){//left<=right不断调用递归
        if(key>a[mid])  BinarySearch(a,key,mid+1,right);
        else BinarySearch(a,key,left,mid);
    }

}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int key;
    cin>>key;
    cout << BinarySearch(a,key,1,n);
    return 0;
}

在这里插入图片描述

分治法求最大值和最小值的详细解析 在当今数据驱动的时代,如何高效地处理和分析大量数据成为了计算机科学和工程领域的核心挑战之一。随着数据规模的不断扩大,传统的线性搜索和简单算法已无法满足性能需求。因此,寻找更高效的算法设计策略显得尤为重要。   分治法(Divide and Conquer)作为一种经典的算法设计思想,通过将复杂问题分解为更小的子问题,逐步求解并合并结果,展现了其在多种应用场景中的强大能力。尤其是在求解最大值和最小值的问题上,分治法不仅提高了算法的效率,还为我们提供了一种清晰的思维框架。 阅读详情

相关推荐

【算法导论学习】分治法求最大子数组

最大子数组分治法问题分析方向对时间复杂度的分析样例分析问题分析分解问题解决问题合并问题对代码的设想中间部分的处理递归部分完整代码 分治法 所谓分治法,就是把问题不断分割变小,常见的是把数组分割为两部分,然后分别计算,将大问题变成小问题。 问题分析方向 这一类问题主要用的是递归的方法,所以时间复杂度普遍为O(nlogn) 对时间复杂度的分析 样例分析 接下来分析最大子数组问题 问题分析 分解问题...

Alivorth的博客 6722

分治算法整理

算法设计与分析,分治算法整理。

mawangjiayou的博客 763

[python] 分治法查找数组元素的最大值和最小值

                              分治法查找数组元素的最大值和最小值   分治法简介:        分治法从字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或者更多相同或者相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题解的合并。利用分治算法解决寻找一个数组元素中的最值问题和快速排序算法的过程相似,可以参照着快...

qq_40102757的博客 7413

二分求最大值最小和最小值最大

P1182 数列分段 Section II 题解 judge函数是判断是否满足在规定区间的个数内满足每个区段和小于mid #include<stdio.h> #include<string.h> #define max(x,y) x>y?x:y typedef long long ll; int r,l=0,m,n; int a[100005]; int judge...

海马有力量的博客 1126

分治法求最大值最小值

1. 问题描述      用分治法查找数组元素的最大值和最小值。 2. 方法概述  (1)将数据集 S 均分为 S1 和 S2;  (2)求解 S1 和 S2 中的最大和最小值;  (3)最终的最大和最小值可以计算得到:min( S1, S2 ), max( S1, S2 );  (4)采用同样的处理方法递归处理 S1 和 S2。   分治方法 (Divide and Conquer):  (1)

zhanglp的专栏 7769

寻找数组中最大值和最小值—分治算法

题目:给定一个数组,求其最大值和最小值 解法:复杂度最低的算法应该是采用分治算法求得的。 分治算法,其基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同,求出子问题的解,就可得到原问题的解。 如果原问题可分割成k个子问题,1这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。 改题目的代码:

kario_reina的专栏 5022

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

代码可直接运行,分治算法比较抽象,需要另外学习这种算法再去理解代码。再贴一个同时求最大值最小值的代码,只是多了两个变量而已。

xianzhetime的博客 1376

用分治法求一个数组的最大最小值

问题:用分治法来求解一个数组的最大最小值      分析:用遍历的方法来求解当然很简单,但是题目给我们的要求是用分治法,因此我们需要每次利用递归来求数组的一个小部分的最大最小值,递归的结束条件是数组中有两个元素或者一个元素。      下面是C语言源代码:(在Linux Ubuntu下gcc 4.0 编译通过 )    #include      // find

henry06的专栏 6271

算法 实验 用循环、递归、分治三种方法求一维数组元素最大值

用循环、递归、分治三种方法求一维数组元素最大值

GAVT的博客 1040

C - 顺序表应用7:最大子段和之分治递归法

C - 顺序表应用7:最大子段和之分治递归法 Description 给定n(1<=n<=50000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。 例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,1.

°渐行渐远っ的博客 1801

FISCO BCOS平台的用户权限控制与分类管理

在区块链技术日益广泛应用的今天,如何管理与控制不同用户的权限,确保系统的安全性与高效性,成为了区块链平台不可忽视的一部分。FISCO BCOS作为一款高效的联盟链平台,通过细粒度的权限控制机制,提供了对不同用户权限的有效管理。本文将深入探讨FISCO BCOS如何实现用户的权限控制,并对不同用户进行分类与权限管理。FISCO BCOS平台通过精密的权限控制机制,不仅提供了对用户表和系统表的细粒度权限管理,还通过工具与接口为开发者和管理员提供了便捷的权限配置与查询功能。

2201_75798391的博客 1062

分治算法求数组的最大值和最小值

利用分治算法求数组的最大值和最小值 #include<stdio.h> #include<iostream> using namespace std; int findmax(int *arr,int first, int last) { int max; int mid=(last+first)/2; if(last==first+1) { return ar...

qq_42818329的博客 5646

2023-12-26~2025-07-04备份

一、海康视觉与汇川机器人 服务器-客户端通信设置IP在同一网段名称IP端口类型海康相机工控机7930服务器机器人3000客户端海康VM服务器设置1通信管理 增添TCP服务端,设置本机IP:192.168.0.20,端口号79302 协议解析 通信双方约定通信格式(设置收发数据格式,分隔符)机器人客户端设置(不同类型机器人设置有差别)1 通讯服务设置 设置连接服务器IP、服务端端口号、机器人端口号,确保连接正常2 协议解析 使用指令代码构建通讯解析。

青铜小码农 3126

算法设计与分析:分治+递归,求解数组中最大值

算法设计与分析:分治+递归,求解数组中最大值 #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; int findMax(int a[],int left,int right) { //分治法+递归,找a[left]到a[right]之间的最大值...

xjn___c_c的博客 1267

Jev模型入门:从API接入到本地部署的完整实践指南

大模型的应用方式正从单一聊天窗口转向复杂的自动化工作流,而推理模型因具备指令跟随与结构化输出能力,成为构建Agent和数据处理管线的关键组件。Jev作为面向通用场景的推理模型,不仅提供了OpenAI兼容的API接口,还支持本地量化部署,兼顾隐私、可控性与长期成本。本文从模型定位出发,明确Jev与基座模型的差异,随后介绍密钥管理、API调用、参数调优,并深入演示基于Ollama与llama.cpp的本地部署流程,包括GGUF模型文件与chat template的匹配要点。针对实践中的常见问题,如密钥泄露、ma

weixin_29057237的博客 359

Ubuntu上通过FinalShell或Asbru访问CentOS虚拟机

使用FinalShell或Asbru远程连接虚拟机

howard2005的专栏 2279

分治求最大最小值c语言递归,求数组元素的最大值,最小值(分治递归)

求数组元素的最大值,最小值(分治递归)(2015-06-19 08:56:23)标签:代码分类:算法//分治递归,求数组元素的最大值,最小值 public class Values { private int max; privateint min; public Values(int max,int min){ this.max=max;this.min=min; } public int ge...

weixin_36150355的博客 1524

交换机端口模式详解:Access、Hybrid、Trunk

交换机是网络中至关重要的组件之一,用于连接各种设备并启用数据的高效流动。为了更好地管理和控制网络流量,交换机提供了不同的端口模式,其中包括Access、Hybrid和Trunk。本文将深入探讨这三种端口模式,详细解释它们的配置、特性和应用场景,以帮助网络管理员更好地理解和优化网络架构。

网络技术联盟站 4016

分治法一个整数数列求最大值最小值_五大常见算法策略之丨递归与分治策略

递归与分治策略递归与分治策略是五大常见算法策略之一,分治策略的思想就是分而治之,即先将一个规模较大的大问题分解成若干个规模较小的小问题,再对这些小问题进行解决,得到的解,在将其组合起来得到最终的解。而分治与递归很多情况下都是一起结合使用的,能发挥出奇效(1+1>2),这篇文章我们将先从递归说起,再逐渐向分治过渡,主要讲解方式是通过9个例题来说明问题的,问题都是根据难度由简到难,由浅...

weixin_39972768的博客 2315

搞定ESD(二):ESD干扰机理分析

大家好,我是记得诚。上文介绍了ESD的基本知识,对ESD的测试标准进行了解析,包括静电发生器的介绍,实验布置要求,静电放电实验的实施及判定等内容。本文主要介绍ESD的干扰机理。

记得诚 4301

Android14 Qcom 从Framework到Driver带你打开WIFI(二)

上篇文章讲到了UI打开WIFI以后,逐步调用到加载底层驱动以及通知等相关流程。这篇接着上文继续往下看WIFI ON的后续动作。

IAYLBL的博客 766

用递归求数组最大值的索引

Before 是在网上看到的 很好的程序 我后面还做了小修改 节约了行数 减少了变量 让我们往下看 用递归的思想来解决,很容易就能够想到分治的思想. 首先,定义一个函数 MaxIndex() 并假定它可以返回数组最值的索引(索引相对于数组开始而言,即相对开始偏移了多少 至少 MaxIndex() 是如何工作的,暂时不需要管.只需要知道,它可以返回最大值的索引不妨设为p. 因此可以将数组分...

LeonSUST的博客 984

Yolov8-pose关键点检测:训练实战篇 | 手部关键点检测

yolo8-pose实战检测手部关键点并优化。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 3397

分治法求数组的最大值和最小值

因为结果要得到两个值,所以在代码设计上需要动点脑子,在函数的形参上加上两个引用型

qijizhen的专栏 3252

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

分治法求最大最小值

分治法解求最大最小值问题 问题描述:在含有n个不同元素的集合a[n]中同时找出它的最大值和最小值。不妨设n=2m次方,m>=0。 分治法 基本思想:将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归的解决这些子问题,然后再将这些子问题合并得到原问题的解。 Divide-and-Conquer(P) { if(|P|<=n0)Adboc(P); divide P into smaller subinstances P1,P2,...,Pk; for(i=

MD_DX的博客 6939

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

分治法求数组最大值

int set_max(int a[],int low,int high)//分治法求数组最大值 { if(low==high) return a[low]; else { int mid=(low+high)/2; int left_max=set_max(a,low,mid); int right_max...

qq_42617565的博客 9044

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 动态规划之最大子段和
下一篇: 动态规划之最长公共子序列问题
practical_sharp
博客等级 码龄8年 499粉丝 148原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值