牛客网《剑指offer》专栏刷题练习之掌握动态规划思想

简介: 牛客网《剑指offer》专栏刷题练习之掌握动态规划思想

一、连续子数组的最大和

1、题目要求



2、个人题解


2.1、解题思路


首先我们要弄清楚题目的含义:什么是连续子数组?


子数组就是小数组里的元素,原数组里必须含义;加上连续,理解起来就是:该数组是原数组里的一串连续的元素或者单个元素。

搞清楚连续子数组后考虑该题的解法:


既然单个元素也属于连续子数组这个范畴,那么从第二个元素开始,我们对该元素和他与前一个元素的和比较,将二者中的较大值存到辅助数组dp中。

定义一个max作为最终的结果,并和数组dp中的元素不断对比,较大值将被赋值给max。

继续遍历,更新继续往dp数组中放入较大值,同时max也不断更新

遍历结束,max的值就是连续子数组的最大和

图示助理解:



2.2、代码实现


class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        if(array.size()==1)
            return *array.begin();
        int dp[array.size()];
        int max=array[0];
        dp[0]=max;
        for(int i=1;i<array.size();i++){
            int temp=dp[i-1]+array[i];
            dp[i] = temp>array[i]? temp:array[i];
            if(dp[i]>max)
                max=dp[i];
        }
        return max;
    }
};


2.3、代码解析


根据题目可知,数组长度是不小于1的,因此在长度为1的时候,直接返回即可

根据数组长度设置辅助数组dp的长度,初始化dp首元素和max的值为数组首元素的值

从第二个元素开始,将子数组和的最大值存入dp数组并更新max的值

遍历结束后,返回max,程序结束,问题解决。

二、连续子数组的最大和(二)


1、题目要求



2、个人题解


2.1、解题思路


该题是在连续子数组的和最大的基础上,返回该连续子数组,这里仍然使用动态规划来解题:


 我们仍然要通过辅助数组dp来记录连续子数组的最大值,并根据最大值来更新连续子数组的区间,最后将最长区间作为数组下标,将区间范围的元素全部插入到要返回的数组中。


具体做法:


创建动态规划辅助数组,记录到下标i为止的最大连续子数组和,下标为0的时候,肯定等于原数组下标为0的元素。


准备左右区间双指针记录每次连续子数组的首尾,再准备两个双指针记录最大和且区间最长的连续子数组的首尾。


遍历数组,对于每个元素用上述状态转移公式记录其dp值,更新区间首尾(如果需要)。


出现一个最大值。且区间长度更大的时候,更新记录最长区间的双指针。

根据记录的最长子数组的位置取数组。


2.2、代码实现


class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> FindGreatestSumOfSubArray(vector<int>& array) {
        // write code here
        if(array.size()==1)
            return array;
        vector<int>res;
        vector<int> dp(array.size(),0);
        dp[0]=array[0];
        int ans=dp[0];
        //滑动区间
        int left=0,right=0;
        //最终的区间范围
        int resl=0,resr=0;
        for(int i=1;i<array.size();i++){
            right++;
            //状态转移:连续子数组的最大值
            dp[i]=max(dp[i-1]+array[i], array[i]);
            //区间新起点
            if(dp[i-1]+array[i]<array[i])
                left=right;
            //更新最大值
            if(dp[i]>= ans)
            {
                ans=dp[i];
                resl=left;
                resr=right;
            }
        }
        //给res数组插入数据
        for(int i=resl;i<=resr;i++)
            res.push_back(array[i]);
        return res;
    }
};

2.3、代码解析


根据题目可知,数组长度是不小于1的,因此在长度为1的时候,直接返回即可

根据数组长度初始化辅助动态数组dp,最大值记为ans且默认为数组首元素的值

声明遍历的区间以及最终的区间并初始化为0

进入for循环,右区间right递增,将最大连续子数组的和存到dp数组中。

如果是相加结果没有自身对应的元素值大,那么right将作为新区间的起点,即:left=right

每次新存入dp数组的元素组和最大值ans比较:

如果dp内的数据大,那么就更新最大值并让最终的区间等于遍历的区间

如果dp内的数据小,不进行操作,最终区间范围不变

随着遍历的进行,最终区间不断变化,遍历结束时,最终区间也就确定了下来

最后根据区间将数组中的数据插入到ans数组中并返回


三、动态规划知识学习


动态规划算法的基本思想是:


将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;


对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。


动态规划算法将问题的解决方案视为一系列决策的结果。

相关文章
|
存储 数据建模 数据库
初探多维表格
最近调研学习了一些多维表格产品,记录一下自己收获的基础认知。在线表格的基础结构是单元格,横向纵向拓展的单元格的集合,就构成了一张工作表。单元格之间可以任意关联,非常灵活。在线表格的适用面很广,能够在数据收集和分析、财会统计等场景发挥重要的作用。在我试图寻找国外的多维表格产品时,发现很少有用「表格」来描述自己的。比如 Airtable 对自己的介绍是:一个构建协同应用的低代码平台。目前国内处于前沿的
2123 0
初探多维表格
|
机器学习/深度学习 安全 算法
担心prompt泄露隐私?这个框架让LLaMA-7B完成安全推理
担心prompt泄露隐私?这个框架让LLaMA-7B完成安全推理
859 0
|
9月前
|
SQL 机器学习/深度学习 人工智能
MaxCompute SQL + AI:重塑企业智能决策的底层逻辑
阿里云MaxCompute SQL推动SQL与AI深度融合,通过内建AI函数实现数据清洗、特征工程到模型推理的全链路智能化。无需切换语言,一行SQL即可完成智能分析,助力电商、金融、医疗等六大行业降本增效,释放数据价值,开启智能生产力新时代。(238字)
255 1
|
10月前
|
人工智能 算法 索引
构建AI智能体:三十六、决策树的核心机制(二):抽丝剥茧简化专业术语推理最佳分裂点
本文深入探讨了决策树的核心机制,重点分析了最佳分裂点的确定方法。通过鸢尾花分类案例,详细解析了基尼不纯度、加权平均基尼不纯度和信息增益等关键指标的计算过程。文章展示了决策树如何通过穷举搜索找到能最大程度降低不纯度的特征阈值(如花瓣宽度1.65cm),并解释了不同随机种子对分裂点选择的影响。决策树通过一系列if-else问题构建分类模型,其核心是追求节点纯度最大化,采用贪婪算法在每个节点选择信息增益最大的分裂方案。这种机制使决策树既直观又强大,但也需要注意过拟合问题。
494 5
|
9月前
|
监控 安全 Cloud Native
2025年十款多因素认证(MFA)解决方案对比
选择合适的多因素认证(MFA)服务,对于保护企业抵御日益增长的网络威胁至关重要。目前市场上MFA解决方案种类繁多,如何为企业挑选最适配的产品成为一大难题。本文将通过对比主流服务商、梳理核心选择要素,助您轻松应对MFA选型的复杂挑战。
473 1
|
存储 人工智能 缓存
SpringBoot离线应用的5种实现方式
在网络依赖日益加深的今天,离线应用的重要性不断上升。本文介绍了基于SpringBoot实现离线应用的五种方式,重点讲解了嵌入式数据库的实现原理与步骤,包括本地数据存储、操作缓存、资源本地化和状态管理等核心功能,分析了其优缺点及适用场景,帮助开发者在无网络环境下构建稳定可靠的应用。
530 0
|
前端开发 搜索推荐
自主开发网站还是建站公司开发网站好?
自建网站成本低、自主性强,适合预算不高、自主维护的用户;建站公司提供一站式服务、技术支持,适合预算足、周期长、需定制化服务的用户。选择取决于企业需求和资源。
517 5
《跟老卫学仓颉编程语言开发》实战:猜数字游戏
本文介绍了用仓颉语言开发的一个简单猜数字游戏,综合运用了流程控制、标准输入、字符串操作和整型比较等知识。程序生成1到100之间的随机整数,用户通过标准输入猜数字,程序提示“太大”或“太小”,直至猜中并显示祝贺信息。代码使用`std.console`包处理输入,`std.convert`包实现字符串转整型,通过`if-else`判断大小,`while`循环支持多次输入。示例源于《跟老卫学仓颉编程语言开发》,源码可在其GitHub仓库获取。
850 0
|
人工智能 IDE 程序员
从 AI Coding 演进路径看通义灵码 AI 程序员的发布,让更多 idea 变成产品
从 AI Coding 演进路径看通义灵码 AI 程序员的发布,让更多 idea 变成产品
|
Python
Python 中如何循环某一特定列的所有行数据
Python 中如何循环某一特定列的所有行数据
374 2