力扣刷题44-46(力扣0062/0152/0198)

62. 不同路径

题目描述:

一个机器人位于一个 m x n 网格的左上角 ,机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径?

思路:

其实就是问(0,0)->(m-1,n-1)一共有几条路。

第一个方法:数学上排列组合

第二个方法:

动态规划。抓住语句:机器人每次只能向下或者向右移动一步,所以动态规划转移方程为dp[i][j]=dp[i-1][j]+dp[i][j-1];考虑边界情况,dp[0][j],从(0,0)->(0,j)一共只有1条路(横着走)dp[i][0]同理只能竖着走。

所以代码如下:

class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n, 1)); // 初始化二维数组并将所有值初始化为1for(int i=1;i<m;i++){for(int j=1;j<n;j++){dp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[m-1][n-1];}
};

本题over


152. 乘积最大子数组

题目描述:

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

思路:

哲哲这道题典型动态规划的背包问题。用dp[i][j]表示从i到j的最大结果,要求连续,可以重新开始,也可以是上一个的结果乘nums[j],来吧状态转移方程:dp[i][j]=max(nums[j],dp[i][j-1]*nums[j])。最后的结果就是返回dp数组里的最大值就可以。但还记得之前有一篇也是类似的做法,后来采用临时变量+max的方法,将复杂度降低么?所以这次依然尝试。

但是!!!显然我忘记了一件事负负得正这个问题。这样会存在跳过的情况。所以方案pass

 但还记得之前有一篇也是类似的做法,后来采用临时变量+max的方法,将复杂度降低么?所以这次依然尝试。(但这句话依然有效)

重新分析:

1.连续想乘,什么情况下会变小?1.*0 直接=0;2.*负数;但负数,会有一个负负得正的情况。所以我们不妨将负数的结果也存下来。

2.转移方程dp[i][j]=max(nums[j],dp[i][j-1]*nums[j])。设置为临时变量+max

于是有了方法:

在计算最大乘积时,我们同时考虑当前位置的值当前位置乘上前一个位置的最大乘积、当前位置乘上前一个位置的最小乘积这三种情况。

我们可以使用两个变量 max_prodmin_prod 来分别记录当前位置之前的最大乘积和最小乘积。然后我们遍历数组,对于每个位置的元素,更新 max_prodmin_prod,并根据当前位置的值、当前位置乘上前一个位置的最大乘积、当前位置乘上前一个位置的最小乘积这三者之间的关系来更新这两个变量。

具体的代码逻辑如下:
  • 用 max_prod 和 min_prod 分别记录当前位置之前的最大乘积和最小乘积,初始化为第一个元素 nums[0]
  • 从第二个元素开始遍历数组,对于每个位置的元素,如果该元素是负数,则交换 max_prod 和 min_prod,因为乘以负数会导致最大值变成最小值,最小值变成最大值。
  • 更新 max_prod 和 min_prod,分别取当前位置的值、当前位置乘上前一个位置的最大乘积、当前位置乘上前一个位置的最小乘积中的最大值和最小值。
  • 在更新 max_prod 的过程中,不断维护全局的最大乘积 result

通过这种方法,我们在遍历数组的过程中不断更新 max_prodmin_prodresult,最终得到的 result 就是乘积最大的子数组的乘积。

顺便举个例子:

假设给定数组 nums = [2, 3, -2, 4],我们来计算乘积最大的连续子数组。初始时,我们有:
max_prod = 2 (以第一个元素结尾的最大乘积)
min_prod = 2 (以第一个元素结尾的最小乘积)
result = 2 (全局最大乘积)接下来,我们依次遍历数组中的元素:对于第二个元素 3:
更新 max_prod = max(3, 2 * 3) = 6,min_prod = min(3, 2 * 3) = 3
更新 result = max(result, 6) = 6对于第三个元素 -2:
因为是负数,交换 max_prod 和 min_prod
更新 max_prod = max(-2, 6 * -2) = -2,min_prod = min(-2, 6* -2) = -12
更新 result = max(result, -2) = 6对于第四个元素 4:
更新 max_prod = max(4, -2 * 4) = 4,min_prod = min(4, -12 * 4) = -48
更新 result = max(result, 4) = 6
最终得到的结果是 6,即数组中乘积最大的连续子数组的乘积为 6。

代码如下:

class Solution {
public:int maxProduct(vector<int>& nums) {int n = nums.size();if (n == 0) return 0;int max_prod = nums[0];int min_prod = nums[0];int result = nums[0];for (int i = 1; i < n; i++) {if (nums[i] < 0) {swap(max_prod, min_prod);}max_prod = max(nums[i], max_prod * nums[i]);min_prod = min(nums[i], min_prod * nums[i]);result = max(result, max_prod);}return result;}
};

198. 打家劫舍

题目:

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

思路:

动态规划,当前一个偷完之后,下一个一定不能偷,但下下一个不一定。………………这样思考比较麻烦,不妨倒过来思考。

假设,我第k个房间,当前的值记为dp[k];则有两种情况:1,上一个房间我投过了,这个房间我不能投;2,上一个房间我没投,我投这个房间。所以dp就有以下表达式

dp[k]=max(dp[k-1],dp[k-2]+nums[k-1])

边界情况:

dp[0]=0; 
dp[1]=nums[0];dp[2]=max(nums[0],nums[1]);
//dp[2]=max(nums[0],dp[2-2]+nums[1]);

 推荐题解:. - 力扣(LeetCode) 

好,于是代码如下:(这个用常量优化有点难,所以先写不优化的)

class Solution {
public:int rob(vector<int>& nums) {int n=nums.size();if(n==0) return 0;if(n==1) return nums[0];vector<int>dp(n+1);dp[0]=0;//dp.push_back(0);//dp[1]=nums[0];dp[2]=max(nums[0],dp[0]+nums[1]);for(int i=3;i<=n;i++){dp[i]=max(dp[i-1],dp[i-2]+nums[i-1]);}return dp[n];}
};

性能太差,优化一下:

优化方法:两个常量+max;(前面两道题也是这样做的,要学会)

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if (n == 0)return 0;if (n == 1)return nums[0];int prev1 = 0; // 用于存储偷窃到当前房屋的最大价值int prev2 = 0; // 用于存储偷窃到前一间房屋的最大价值for (int i = 0; i < n; ++i) {int temp = prev1; // 临时变量存储偷窃到当前房屋的最大价值prev1 =max(prev2 + nums[i], prev1); // 更新当前房屋的最大偷窃价值prev2 = temp; // 更新前一间房屋的最大偷窃价值}return prev1; // 返回最后一间房屋的偷窃价值即为最终答案}};

今日结束ocver


总结一下动态规划的模板吧

动态规划问题的一般解题思路可以总结为以下几个步骤:

  1. 定义状态:明确定义dp数组的含义,即每个元素dp[i]代表的是什么状态,可以是最大值、最小值等。

  2. 初始化:根据问题的要求对dp数组进行初始化,将初始条件赋给dp数组中相应的元素。

  3. 状态转移方程:找出状态之间的转移关系,即如何通过已知的状态推导出未知的状态。这是动态规划问题的核心,也是最难的部分。

  4. 递推计算:通过循环遍历或者递归的方式填充dp数组,根据状态转移方程更新每个位置的值。

  5. 返回结果:根据问题的要求从dp数组中得到最终的结果,可能是dp数组的最后一个元素,也可能是整个dp数组中的最大/最小值等。

代码:

// 初始化dp数组
vector<int> dp(n, initial_value);// 处理边界条件
dp[0] = initial_condition;// 状态转移方程计算dp数组的值
for (int i = 1; i < n; ++i) {// 根据状态转移方程更新dp[i]dp[i] = update_function(dp, i, other_parameters);
}// 返回最终结果
return final_result;

说在最后,

其实动态规划最核心的就是找出地推关系式。可以抽象的想第k个状态,往前倒退,找出关系式,用1,2,临街情况测试状态方程是否正确。最后再讲dp数组改进为常量,节省空间。

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

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

相关文章

突破限制:亚信安慧AntDB高速处理能力的解密

AntDB不仅仅是一款优秀的数据库管理系统&#xff0c;更是一套提供丰富数据分析和处理工具的集合&#xff0c;它为用户提供了更多可能性&#xff0c;帮助他们深入理解数据、挖掘数据背后的价值。在当今信息爆炸的时代&#xff0c;数据已经成为企业决策的重要支撑&#xff0c;而A…

QT_day4:对话框

1、完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&…

ubuntu下安装minconda

1.搜索清华源 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2.搜索conda 3.选一个合适自己的下载到本地 4.将下载的文件传入到ubuntu中 bash Miniconda3-py311_23.11.0-1-Linux-x86_64.sh 安装 5.source ~/.bashrc 激活即可&#xff08;必要步骤&#xff09;

Qt实现简易的多线程TCP服务器(附源码)

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化&#xff0c;m_widget我们用于后续的显示消息等&#xff0c;说白了就是主界面的更新显示等 …

[JVM]——垃圾回收

学习内容&#xff1a; GC、垃圾回收器、垃圾回收算法 目录 一、GC垃圾回收算法 1.1 可达性分析法 1.1.1 GC ROOT对象&#xff1a; 1.1.3 四种引用方式&#xff1a; ⭐小结&#xff1a; 1.2 其他回收算法 二、详解分代回收法&#xff1a; 三、垃圾回收器 3.1 串行垃圾…

人才测评,招聘视频制作影视设计师岗位的测评方案

常见的酷炫的视频&#xff0c;短视频&#xff0c;以及广告特效&#xff0c;年会中的各种片子&#xff0c;可以说各种各样的视觉盛宴&#xff0c;它们可都是出自影视后期的设计之手&#xff0c;尤其是当下短视频的兴起&#xff0c;抖音快速阿婆主&#xff0c;直播带货和主播&…

git笔记之撤销、回退、reset方面的笔记

git笔记之撤销、回退、reset方面的笔记 code review! 文章目录 git笔记之撤销、回退、reset方面的笔记1.git 已经commit了&#xff0c;还没push&#xff0c;如何撤销到初始状态git reset --soft HEAD~1git reset HEAD~1&#xff08;等同于 git reset --mixed HEAD~1&#xff0…

二十二、软考-系统架构设计师笔记-真题解析-2018年真题

软考-系统架构设计师-2018年上午选择题真题 考试时间 8:30 ~ 11:00 150分钟 1.在磁盘调度管理中&#xff0c;应先进行移臂调度&#xff0c;再进行旋转调度。假设磁盘移动臂位于21号柱面上&#xff0c;进程的请求序列如下表所示。如果采用最短移臂调度算法&#xff0c;那么系统…

详解Python面向对象编程(一)

类和对象 面向过程——怎么做&#xff1f; &#xff08;1&#xff09;把完成某一需求的所有步骤、从头到尾&#xff0c;逐步实现 &#xff08;2&#xff09;根据开发需求&#xff0c;将某些功能独立的代码块封装成一个又一个的函数 &#xff08;3&#xff09;最后完成的代码&a…

【Unity3D小功能】Unity3D中实现点击‘文字’出现‘UI面板’

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 宠粉博主又来了&#xff0c;今天有粉丝问我如何实…

群晖NAS安装Video Station结合内网穿透实现公网访问本地影音文件

文章目录 1.使用环境要求&#xff1a;2.下载群晖videostation&#xff1a;3.公网访问本地群晖videostation中的电影&#xff1a;4.公网条件下使用电脑浏览器访问本地群晖video station5.公网条件下使用移动端&#xff08;搭载安卓&#xff0c;ios&#xff0c;ipados等系统的设备…

GitHub加速访问最简单的方法

Github是全球最大的代码开源平台&#xff0c;对于编程的小伙伴来说&#xff0c;这是一个巨大的宝库&#xff0c;也是编程学习的圣地。很对小伙伴在使用GitHub时会经常出现无法访问Github的情况。 一、解决方法——>修改hosts文件 通过 IP查询工具来获取当前Github网站的真实…

Android14之深入理解sp模板类(二百零二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【机器学习】引领未来的力量:技术革新与应用探索

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…

【No.17】蓝桥杯图论上|最短路问题|Floyd算法|Dijkstra算法|蓝桥公园|蓝桥王国(C++)

图的基本概念 图&#xff1a; 由点(node&#xff0c;或者 vertex)和连接点的边(edge)组成。图是点和边构成的网。 树&#xff1a;特殊的图树&#xff0c;即连通无环图树的结点从根开始&#xff0c;层层扩展子树&#xff0c;是一种层次关系&#xff0c;这种层次关系&#xff0…

铁道障碍物检测6种YOLOV8

铁道障碍物检测6种&#xff0c;采用YOLOV8训练&#xff0c;得到PT模型&#xff0c;然后转换成ONNX模型&#xff0c;OPENCV调用 铁道障碍物检测6种YOLOV8

开发者的瑞士军刀:DevToys

DevToys&#xff1a; 一站式开发者工具箱&#xff0c;打造高效创意编程体验&#xff0c;让代码生活更加得心应手&#xff01;—— 精选真开源&#xff0c;释放新价值。 概览 不知道大家是否在windows系统中使用过PowerToys&#xff1f;这是微软研发的一项免费实用的系统工具套…

css3鼠标悬停图片特效,图片悬停效果源码

特效介绍 css3鼠标悬停图片特效,图片悬停效果源码&#xff0c;可以在网页上面作为自己的动态加载名片&#xff0c;放到侧边栏或者网站合适的位置即可 动态效果 代码下载 css3鼠标悬停图片特效,图片悬停效果源码

解决mysql问题: this is incompatible with sql_mode=only_full_group_by

今天在部署一趟测试环境的服务&#xff0c;各种配置文件都配好了&#xff0c;启动服务后台报错&#xff0c;解决后记录一下&#xff0c;小伙伴们也可以看看&#xff01; ### Cause: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause…

代码随想录算法训练营第四十六天|139.单词拆分、56. 携带矿石资源(第八期模拟笔试)

139.单词拆分 刷题https://leetcode.cn/problems/word-break/description/文章讲解https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html视频讲解https://www.bilibili.com/video/BV1pd4y147Rh/?vd_sourceaf4853e80f89e28094a5fe1e220d9062 题解&…