求最大字段和(穷举法、动态规划、分治法)

news2024/11/24 18:36:31

目录

        • 1、案例要求
        • 2、算法设计与实现
          • 2.1 穷举法
            • 2.1.1 算法设计思路
            • 2.1.2 代码实现
          • 2.2 动态规划
            • 2.2.1 算法设计思路
            • 2.2.2 实现代码
          • 2.3 分治法
            • 2.3.1 算法实现思路
            • 2.3.2 代码实现
        • 3、总结


1、案例要求

给定由n个整数(可能为负整数)组成的序列a1,a2,…,an,求该序列形如:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QAbrqvEv-1684376003140)(file:///C:\Users\ljp\AppData\Local\Temp\ksohtml4224\wps1.png)]
的子段和的最大值。当所有整数均为负数时定义其最大子段和为0。

分别采用穷举法、分治法、动态规划法完成。

2、算法设计与实现

2.1 穷举法
2.1.1 算法设计思路

通过定义遍历子段起始位置与子段和长度将所有情况计算一遍,从而得到最大子段和;

2.1.2 代码实现

时间复杂度:O(n2)

public static int qiuju(int[] nums){
    int len=nums.length;
    if(len==1) return nums[0];
    int res=nums[0];

    //起始位置
    for(int i=0;i<len;i++){
        //子段和长度
        int max=0;
        for(int j=1;j<=len-i;j++){
            max+=nums[i+j-1];
            res=Math.max(res,max);
        }
    }
    return res;
}
2.2 动态规划
2.2.1 算法设计思路

将问题转移为求以各数组元素结尾的子段最大和,对每个序列元素求结尾最大子段和时,通过比较前一个元素结尾最大子段和是否为负数,是则重新开始,否则拼接到上一个连续子段,最后比较所有的结尾最大子段和得到最大子段和。

2.2.2 实现代码

时间复杂度:O(n)

public static int dynamicProgram(int[] nums){
    int len=nums.length;
    if(len==1) return nums[0];
    //状态转移数组,以nums[i]结尾的连续子数组的最大和
    int[] dp=new int[len];
    dp[0]=nums[0];

    for(int i=1;i<len;i++){
        if(dp[i-1]<0){
            //前一个数组元素结尾的最大和为负,重新开始
            dp[i]=nums[i];
        }else{
            //拼接到上一个连续子数组
            dp[i]=dp[i-1]+nums[i];
        }
    }

    int res=nums[0];
    //遍历dp数组,找到最大和所在结尾nums元素,
    // 并返回最大和
    for(int num:dp){
        res=Math.max(res,num);
    }
    return res;
}
2.3 分治法
2.3.1 算法实现思路

将序列分为三部分进行求解,分别是[left,mid]、[mid,mid+1]、[mid+1,right],分别对三部分求最大子段和,最后比较三部分得到最大子段和。

2.3.2 代码实现

时间复杂度:O(nlog2n)

public static int fenzhi(int[] nums,int left,int right){
    //分到中间位置重合,结束递归
    if(left==right){
        return nums[left];
    }
    //确定中间位置
    int mid=left+(right-left)/2;
    //返回三种情况的最大值
    return Max3(fenzhi(nums,left,mid),
                fenzhi_mid(nums,left,mid,right),
                fenzhi(nums,mid+1,right));
}

public static int fenzhi_mid(int[] nums,int left,int mid,int right){
    int sum=0;
    //确定左边最大和
    int left_sum=Integer.MIN_VALUE;
    //从中间往左遍历,不能从左开始
    for(int i=mid;i>=left;i--){
        sum+=nums[i];
        left_sum=Math.max(sum,left_sum);
    }

    sum=0;
    //确定右边最大和
    int right_sum=Integer.MIN_VALUE;
    for(int i=mid+1;i<=right;i++){
        sum+=nums[i];
        right_sum=Math.max(right_sum,sum);
    }
    //返回左右之和
    return left_sum+right_sum;
}

public static int Max3(int n1,int n2,int n3){
    //返回三数之和最大值
    return Math.max(n1,Math.max(n2,n3));
}

3、总结

动态规划的算法思路与代码实现较难,其适用于解最优化问题,其求解三大步骤:定义数组dp[i]中元素含义、找出数组元素之间的关系式、找出初始值较为关键,需充分理解题意再开始进行代码实现!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

菜鸟对原型链的理解

1.什么是原型 函数下的prototype属性&#xff0c;是个指针&#xff0c;指向的对象就是原型 2.什么是原型链 很多个原型连接起来就是一条链了。 function Person() { } var test new Person(); 当我们new一个构造函数是&#xff0c;实例对象&#xff08;test&#xff09;&a…

Windows平台上的5种敏捷软件开发(过程)模型

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下Windows平台上的5种敏捷软件开发(过程)模型。 说到这个问题&#xff0c;你必须先知道除了敏捷模型还有没有其他什么模型&#xff1f;同时要比较模型的区别&#xff0c;首先还要看看什么叫软件开…

文件权限-chmod命令 – 改变文件或目录权限

Linux chmod命令 – 改变文件或目录权限 在Linux系统中&#xff0c;每个文件和目录都有自己的权限属性&#xff0c;这些属性包括读、写、执行等权限。通常情况下&#xff0c;只有文件的所有者和管理员可以设置文件权限&#xff0c;而普通用户只能管理自己文件的权限。为了更好…

数据结构总结5:堆

后续会有补充 堆 堆是一种数据结构&#xff0c;总是一棵完全二叉树&#xff0c;是使用数组存储的&#xff0c;是非线性的&#xff1b;并且要求树中所有的父亲都小于等于孩子&#xff08;小根堆&#xff09;/树中所有的父亲都大于等于孩子&#xff08;大根堆&#xff09;不一定…

人工智能基础部分16-神经网络与GPU加速训练的原理与应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能基础部分16-神经网络与GPU加速训练的原理与应用&#xff0c;在深度学习领域&#xff0c;神经网络已经成为了一种流行的、表现优秀的技术。然而&#xff0c;随着神经网络的规模越来越大&#xff0c;训练神经…

Linux下部署Samba服务(实现windows和linux共享)

关于Linux和Windows系统之间的文件传输&#xff0c;很多人选择使用FTP&#xff0c;相对较安全&#xff0c;但是有时还是会出现一些问题&#xff0c;比如上传文件时&#xff0c;文件名莫名出现乱码&#xff0c;文件大小改变等问题。相比较来说&#xff0c;使用Samba作为文件共享…

Midjourney会员充值教程

本教程收集于:AIGC从入门到精通教程 Midjourney会员充值教程 目录 一、 打开会员订阅页面 二、 选择您需要订阅的会员

8. 机器学习系统设计

假设你想建立一个垃圾邮件分类器&#xff0c;通过监督学习来构造一个分类器来区分垃圾邮件和非垃圾邮件。为了应用监督学习&#xff0c;首先要想的就是&#xff1a;如何来表示邮件的特征向量x&#xff0c;通过特征向量x和分类标签y&#xff0c;我们就能训练一个分类器&#xff…

(十六)数据编辑——图形编辑②

数据编辑——图形编辑② 目录 数据编辑——图形编辑②1.5线要素的延长和裁剪1.5.1线要素延长1.5.2线要素裁剪 1.6要素的变形与缩放1.6.1要素变形操作1.6.2要素缩放操作 1.7要素结点的编辑1.7.1添加结点1.7.2删除结点1.7.3移动结点 1.5线要素的延长和裁剪 单击编辑器下拉菜单&a…

【Nvidia Jetson Xavier NX/AGX/NANO】上用docker跑pytorch等cv推理应用

Nvidia Jetson Xavier NX/AGX docker WHY镜像地址使用方法docker常用命令备忘jtop安装关于保存容器镜像关于使用dockerfile构建关于映射外部路径让容器访问外部文件关于性能 WHY 在jetson上使用docker跑opencv和pytorch其实主要是要找对镜像&#xff0c;docker官方的hub里并没…

linux0.12-9-5-ramdisk.c

1、 需要配合其他代码一起看&#xff0c;才能有深刻的理解。 [432页] 9-5 ramdisk.c程序 9-5-1 功能描述 本文件是内存虚拟盘(Ram Disk)驱动程序&#xff0c;由Theodore Ts’o编制。虚拟盘设备是一种利用物理内存来模拟实际磁盘存储数据的方式。其目的主要是为了提高对&quo…

Conda 安装Pytorch

1、conda 切换虚拟环境 activate 虚拟环境名称 C:\Windows\System32>activate python310 温馨提示&#xff1a;查询虚拟环境列表 conda env list C:\Windows\System32>conda env list # conda environments: # base D:\anaconda3 python310 …

15-01通信安全

网络设备安全——防火墙 状态检测 应用级代理 防火墙实战 默认禁止&#xff1a;Ingress和Egress高安全域优先&#xff1a;允许高安全域发起请求规则具体&#xff1a;源地址&#xff08;标签&#xff09;、源端口&#xff0c;目标地址&#xff08;标签&#xff09;、目标端口、…

CSAPP复习(1)

分析方法只讲了amuda定理 Hello的一生 hello的执行过程 了解hello的执行过程 和响应的汇编器生成的可执行文件是.out不是.exe gcc -E hello.c -o hello.i//预处理 cpp hello.c>hello.i gcc -S hello.i -o hello.s//编译 gcc -C hello.s -o hello.o//汇编 二进制文件看不到…

【PDF软件篇】PDF轻量化电子笔记编辑利刃-Xodo软件优化

【PDF软件篇】PDF轻量化电子笔记编辑利刃-Xodo软件优化 默认配置已经够强&#xff0c;但是我还是推荐自定义&#xff0c;适合自己的就是最好的—【蘇小沐】 文章目录 【PDF软件篇】PDF轻量化电子笔记编辑利刃-Xodo软件优化1.实验环境 &#xff08;一&#xff09;日常办公导出无…

Redis使用lua脚本实现库存扣减

为什么使用Lua脚本为什么能合并多个原子操作&#xff1f; 这里参考官方文档地址&#xff1a;Scripting with Lua | Redis Redis 保证Lua脚本的原子执行。在执行脚本时&#xff0c;所有服务器活动在其整个运行期间都被阻止。这些语义意味着脚本的所有效果要么尚未发生&#xff…

矢量图形设计工具Affinity Designer 2.04版本在win10系统上的下载与安装配置教程

目录 前言一、Affinity Designer安装二、使用配置总结 前言 Affinity Designer 是一款由 Serif 公司开发的矢量图形设计工具&#xff0c;可用于创建各种类型的设计项目&#xff0c;例如图标、UI 设计、品牌标识、插图和其他类型的矢量图形。 Affinity Designer 工具的详细介绍…

JS解密入门案例:python有道JS解密,做一个简单的翻译程序

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 目录标题 前言本次使用知识点&#xff1a;开发环境:模块使用:思路流程:代码展示尾语 &#x1f49d; 本次使用知识点&#xff1a; 系统分析网页结构 动态数据抓包演示 json数据解析 JS解密 开发环境: Python 3.8 Pycha…

Java形参实参的使用

Java形参实参的使用 形参实参的介绍简单例子稍复杂例子String类 compareTo方法 形参实参的介绍 在JAVA中&#xff0c;形参和实参是非常常见的概念。形参是指在方法定义时声明的参数&#xff0c;用于描述方法需要接收的输入数据类型和变量名&#xff1b;而实参是指在方法调用时…