力扣刷题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.rhkb.cn/news/286868.html

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

相关文章

office办公技能|word中的常见使用问题解决方案2.0

一、设置多级列表将表注从0开始&#xff0c;设置为从1开始 问题描述&#xff1a;word中插入题注&#xff0c;出来的是表0-1&#xff0c;不是1-1&#xff0c;怎么办&#xff1f; 写论文时&#xff0c;虽然我设置了“第一章”为一级标题&#xff0c;但是这三个字并不是自动插入的…

QMT量化交易上手

文章目录 QMT介绍基本使用代码初始化股票和行情交易量化策略示例相关链接QMT介绍 QMT是迅投公司出品量化交易客户端软件,目前只能运行在windows机器上,分为QMT 和 miniQMT两种模式,后者可以采用python API做程序化交易,极大方便了广大散户。这点上比同花顺/通信达好很多。…

软件推荐 篇三十七:安卓软件推荐IP Tools「IP工具」:全面解析网络状态与管理的必备神器

引言&#xff1a; 随着互联网的普及&#xff0c;网络已经成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们都需要通过网络来进行各种操作。然而&#xff0c;网络问题的出现往往会给我们带来诸多困扰。为了更好地管理和优化网络&#xff0c;我们…

tomcat配置静态资源后无法正常访问

目录 一、场景二、配置三、访问异常四、排查五、原因六、解决 一、场景 1、将前端文件存在到指定目录 2、在tomcat配置静态资源 3、配置后无法正常访问到前端文件 二、配置 1、tomcat配置 2、静态资源 三、访问异常 四、排查 可以ping通&#xff0c;但是访问不了3080端口 …

rabbitmq 3.9.29 docker mac 管理员页面无法打开

SyntaxError: Unexpected token ‘catch’ SyntaxError: Unexpected token ‘catch’ at EJS.Compiler.compile (http://127.0.0.1:15672/js/ejs-1.0.min.js:1:6659) at new EJS (http://127.0.0.1:15672/js/ejs-1.0.min.js:1:1625) at format (http://127.0.0.1:15672/js/main…

程序员35岁会失业吗?【来自主流AI的回答】

程序员35岁会失业吗&#xff1f; 35岁被认为是程序员职业生涯的分水岭&#xff0c;许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长&#xff0c;技术更新换代的速度会使得资深程序员难以跟上&#xff1b;而另一些人则认为&#xff0c;丰富的经…

用BSP优化3D渲染

3D渲染引擎设计者面临的最大问题之一是可见性计算&#xff1a;只必须绘制可见的墙壁和物体&#xff0c;并且必须以正确的顺序绘制它们&#xff08;应该在远处的墙壁前面绘制近墙&#xff09; 。 更重要的是&#xff0c;对于游戏等应用程序来说&#xff0c;开发能够快速渲染场景…

【python】Jupyter Notebook 修改默认路径

文章目录 一、修改前&#xff08;一&#xff09;问题&#xff08;二&#xff09;修改前的默认路径 二、修改配置文件、更改路径&#xff08;一&#xff09;找到配置文件并打开&#xff08;二&#xff09;创建目标文件夹、得到新的路径&#xff08;三&#xff09;修改配置文件 三…

Android15功能和 API 概览

Android 15 面向开发者引入了一些出色的新功能和 API。以下部分总结了这些功能&#xff0c;以帮助您开始使用相关 API。 如需查看新增、修改和移除的 API 的详细列表&#xff0c;请参阅 API 差异报告。如需详细了解新的 API&#xff0c;请访问 Android API 参考文档&#xff0…

【Redis】数据类型、事务执行、内存淘汰策略

目录 数据类型 Redis事务执行步骤 步骤&#xff1a; redis内存淘汰策略 设置内存淘汰策略 1.设置配置文件 2.通过命令设置 数据类型 官网解释 Understand Redis data types | Redis 首先&#xff0c;Redis 的所有键都是字符串,常用的数据类型有 5 种&#xff1a;Strin…

蓝牙信标覆盖范围

蓝牙信标覆盖范围是一个重要的考虑因素&#xff0c;对于蓝牙技术的应用和部署至关重要。了解蓝牙信标的覆盖范围可以帮助我们更好地规划蓝牙设备的布局和位置&#xff0c;从而实现最佳的信号覆盖和传输效果。 首先&#xff0c;我们需要明确蓝牙信标的覆盖范围受到多种因素的影…

python--递归

1.递归 object--对象 递归&#xff08;recursion&#xff09;&#xff1a; 函数自身调用自身 2.求1~100的和 def count(num):# n (n-1) ... 1if num 1:return 1return num (count(num - 1))print(count(100))3.求Fibonacci 0 1 1 2 3 5 …

外包干了1年....字节跳动面试高频考点,懒加载

一、文章内容 什么是懒加载懒加载的优点什么时候使用懒加载学习懒加载前置内容实战懒加载图片 二、什么是懒加载? 从语法角度分析懒加载,懒是adj形容词,加载是名词;或者懒看为副词,加载作为动词,这样就能理解懒加载了就是懒懒的/地加载,更通俗的讲就是通过一种手段来加载.就…

Linux内核err.h文件分析

在阅读和编写内核相关的代码时&#xff0c;经常会看到IS_ERR、ERR_PTR等函数。这些函数在内核头文件的err.h中。以我服务器的代码为例&#xff0c;内核版本为5.15。 这个文件的代码如下&#xff1a; /* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_ERR_H #define _L…

Nacos介绍和统一配置管理

Nacos&#xff08;全称为 Alibaba Cloud Nacos&#xff0c;或简称为 Nacos&#xff09;是一个开源的分布式服务发现和配置管理系统。它由阿里巴巴集团开发并开源&#xff0c;旨在帮助开发人员简化微服务架构下的服务注册、发现和配置管理。 一、Nacos 提供了以下主要功能&…

论文阅读之PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization(2024)

文章目录 论文地址主要内容主要贡献模型图技术细节实验结果 论文地址 PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization 主要内容 这篇文章的主要内容是介绍了一种名为PeriodicLoRA&#xff08;PLoRA&#xff09;的参数高效微调&#xff08;Parameter-…

基于Springboot Vue医院管理系统+数据库脚本+文档(万字)

项目效果视频: 基于Springboot Vue医院管理系统 一、 项目介绍 角色&#xff1a;管理员、患者、医生 基于springboot vue实现的医院管理系统&#xff0c;有管理员、医生和患者三种角色。系统拥有丰富的功能&#xff0c;能够满足各类用户的需求&#xff0c;系统提供了登录和注册…

ensp静态路由综合实验(一)

实验拓扑&#xff1a; 实验目的&#xff1a; 1、R6为ISP&#xff0c;接口IP地址均为公有地址&#xff0c;该设备只能配置IP地址&#xff0c;之后不能再对其进行任何配置&#xff1b; 2、R1-R5为局域网&#xff0c;私有IP地址192.168.1.0/24&#xff0c;请合理分配&#xff1b;…

超声波清洗机值不值得买?今年最值得入手的四款眼镜清洗器推荐!

如果是经常佩戴眼镜&#xff0c;并且眼镜比较容易脏&#xff0c;自己又很懒不会经常清洗眼镜的时候&#xff0c;不妨考虑眼镜超声波清洗机&#xff01;因为眼镜在比较脏的时候&#xff0c;如果不清洁干净&#xff0c;长期佩戴模糊不清的镜片&#xff0c;会导致眼镜的视力下降严…

UE5C++学习(四)--- SaveGame类存储和加载数据

上一篇说到使用数据表读取数据&#xff0c;如果我开始玩游戏之后&#xff0c;被怪物打了失去了一部分血量&#xff0c;这个时候我想退出游戏&#xff0c;当我再次进入的时候&#xff0c;希望仍然保持被怪物打之后的血量&#xff0c;而不是重新读取了数据表&#xff0c;这个时候…