代码随想录算法训练营第32天 | 122.买卖股票的最佳时机II 55.跳跃游戏 45.跳跃游戏II

买卖股票的最佳时机II

Alt

贪心思路

要想使用贪心算法解决此问题,意识到利润是可分解的很关键。比如[1,2,3,4,5]这个输入,最大利润为第一天买入,第五天卖出。这等效于第一天买入,第二天卖出,第二天再买入。。。
prices[4] - prices[0] = (prices[1] - prices[0]) + (prices[2] - prices[1]) + (prices[3] - prices[2]) + (prices[4] - prices[3])
所以总利润的最大值等于所有头天买第二天卖的正利润之和,局部最优组成了全局最优,可以用贪心算法。

class Solution{
public:
	int maxProfit(vector<int>& prices){
		int result = 0;
		for(int i = 1; i < prices.size(); i++){
			result += max(prices[i] - prices[i - 1], 0);
		}
		return result;
	}
};

动态规划思路

每一天的操作要么买入要么卖出,在该天要么持有股票,要么不持有股票。
dp[i][0]代表在第 i 天持有股票后的最大利润,dp[i][1]代表在第 i 天不持股的最大利润。

class Solution{
public:
	int maxProfit(vector<int>& prices){
		int n = prices.size();
		vector<vector<int>> dp(n, vector<int>(2, 0));
		dp[0][0] -= prices[0];
		for(int i = 1; i < n; i++){
			// 在第i - 1天持有股票的最大利润和第i - 1天没持股第i天买入之中选择最大值
			dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
			// 在第i - 1天不持股的最大利润和第i - 1天持股第i天卖出之中选择最大值 
			dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
		}
		return dp[n - 1][1];
	}
};

跳跃游戏

Alt
怎么跳不是问题,重点在于能跳的范围,范围内的每一点都能到达!
贪心算法局部最优解:每次取最大可跳步数,更新最远可跳范围。全局最优解:得到整体最远范围,看能否覆盖终点。

class Solution{
public:
	bool canJump(vector<int>& nums){
		int cover = 0;
		for(int i = 0; i <= cover; i++){  // 注意是小于等于能到达的范围
			cover = max(cover, i + nums[i]);
			if(cover >= nums.size() - 1)  return true;  // 如果能到达的范围已经覆盖了终点,返回true
		}
		return false;  // 到不了终点
	}
};

跳跃游戏II

Alt
与上一道题相似,也是通过跳跃的覆盖范围来判断是否需要走一步。贪心的局部最优策略是让当前可跳的覆盖范围尽量大,如果覆盖范围没到终点,步数就+1,全局最优就做到了以最小的步数增大覆盖范围。这道题需要统计两个覆盖范围,一个是当前这一步的最大覆盖和下一步的最大覆盖
如果下标到达了当前这一步的最大覆盖位置,还没到终点的话,那么就必须再走一步来增大覆盖范围,直到覆盖范围能覆盖终点。

class Solution{
public:
	int jump(vector<int>& nums){
		int result = 0;  // 统计步数
		if(nums.size() == 1)  return result;
		int curCover = 0;  // 当前步的最大覆盖
		int nextCover = 0;  // 下一步能达到的最大覆盖
		for(int i = 0; i < nums.size(); i++){
			nextCover = max(nextCover, i + nums[i]);  // 求下一步能到的最大覆盖范围
			if(i == curCover){  // 到达当前步的最大覆盖位置
				result++;  // 需要往前走一步
				curCover = nextCover;  // 更新覆盖范围
				if(curCover >= nums.size() - 1)  break;  // 如果新的覆盖范围已经覆盖了终点,结束循环
				// 避免在for循环中i=nums.size()-1 && i==curCover,又对result+1
			}
		}
		return result;
	}
};

代码可以再简洁一些,因为题目中说了给的数组是一定能跳到终点的。所以可以调整 for 循环的终止位置,只到nums.size() - 2即可。这样不会抵达终点,当抵达当前最大覆盖时,必须往前走一步,不需要另外判断下一步是否已经覆盖终点。

class Solution{
public:
	int jump(vector<int>& nums){
		int result = 0;
		if(nums.size() == 1)  return result;
		int curCover = 0;
		int nextCover = 0;
		for(int i = 0; i < nums.size() - 1; i++){
			nextCover = max(nextCover, i + nums[i]);
			if(i == curCover){  // 已经到达了当前的最大覆盖
				result++;
				curCover = nextCover;
			}
		}
		return result;
	}
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用navigator.sendBeacon完成网页埋点异步请求记录用户行为,当网页关闭的时候,依然后完美完成接口请求,不会因为浏览器关闭了被中断请求。

代码用例 <template><div :class"$options.name"><el-button type"primary" click"sendBeacon">navigator.sendBeacon 请求埋点接口 发送json对象数据</el-button></div> </template><script> expor…

WindowsOS

C:. ├─PerfLogs&#xff0c;系统日志文件夹 ├─Program Files&#xff0c;程序文件 ├─Program Files&#xff08;x86&#xff09;&#xff0c;程序文件&#xff08;x86&#xff09; ├─ProgramData&#xff0c;程序数据 ├─Windows&#xff0c;Windows系统文件夹 └─Us…

从零开始做题:逆向 ret2libc warmup

1.题目信息 warmup.c //gcc -fno-stack-protector -no-pie -z execstack warmup.c -o warmup #include <stdio.h>void init_proc(){setbuf(stdout, NULL);setbuf(stdin, NULL);setbuf(stderr, NULL); }int main(void) {char buf[0x100];init_proc();puts("Hello C…

python解决n以内的质数问题

对于日常的一些问题,例如求出n以内的质数问题,这都是经常会遇到的一些问题,可能会在面试的过程当中都会被问到的问题,所以针对这个比较基础的问题进行解答。 问题是需要找出n以内的所有质数(不包括n这个数),质数的定义是在大于1的自然数中,除了1和它本身以外,不再有其…

Go 为什么建议使用切片,少使用数组?

1 介绍 在 Go 语言中&#xff0c;数组固定长度&#xff0c;切片可变长度&#xff1b;数组和切片都是值传递&#xff0c;因为切片传递的是指针&#xff0c;所以切片也被称为“引用传递”。 读者朋友们在使用 Go 语言开发项目时&#xff0c;或者在阅读 Go 开源项目源码时&#…

ctfhub—RCE通关

0、前言 0.1 、什么是RCE RCE全称&#xff1a;Remote Command/Code Execute&#xff0c;远程命令执行或者代码执行。RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统。 为什么会有命令执行漏洞呢&#xff1f;因为…

使用电脑时突然遇到“mfc140.dll文件丢失”的问题都有什么解决办法

当你在使用电脑时突然遇到“mfc140.dll文件丢失”的问题时&#xff0c;可能会感到困惑和苦恼。一旦出现这样的问题&#xff0c;缺少这个文件可能导致一些应用程序无法正常启动&#xff0c;影响你的工作和娱乐体验。其实这个问题是可以解决的&#xff0c;接下来我们将介绍一些可…

xxl-job相关面试题整理

什么是xxl-job&#xff1f; ​ xxl-job是一个分布式的任务调度平台&#xff0c;其核心设计目标是&#xff1a;学习简单、开发迅速、轻量级、易扩展&#xff0c;现在已经开放源代码并接入多家公司的线上产品线&#xff0c;开箱即用。xxl是xxl-job的开发者大众点评的许雪里名称的…

CSS3基础知识总结

目录 一、CSS3 边框 1.border-radius&#xff1a;圆角边框 2.box-shadow&#xff1a;添加阴影 3.border-image&#xff1a;图片边框 二、CSS3 渐变 1.线性渐变(Linear Gradients) a.由上到下&#xff08;默认&#xff09; b.从左到右 c.对角 d.使用角度 2.径向渐变(…

计算机提示缺失dll文件怎么办?那种dll解决方法更值得推荐

当在运行游戏&#xff0c;软件程序的过程中遇到“找不到dll”的情况时&#xff0c;这实际上意味着系统或应用程序无法定位并加载必要的动态链接库文件&#xff08;DLL&#xff09;&#xff0c;从而无法顺利完成预期的功能调用和执行流程。这种问题的发生可能会引发一系列严重后…

蓝桥云课-第4场小白赛理解

网址&#xff1a;第 4 场 小白入门赛 - 蓝桥云课 (lanqiao.cn) 第一题&#xff1a;美丽的2024 思路&#xff1a; 2024 -直接用变成二进制的函数或者模拟二进制的过程&#xff0c;找到有几个1就行 第二题&#xff1a;自助餐 题目&#xff1a; 思路&#xff1a;就是用字符串代…

x-cmd pkg | go - Google 开发的开源编程语言

目录 简介首次用户技术特点竞品分析编译型语言解释型语言JavaWebAssebmly 进一步阅读 简介 Go 语言&#xff08;或 Golang&#xff09;是 Google 开发的开源编程语言&#xff0c;诞生于 2006 年。其设计目标是“兼具 Python 等动态语言的开发速度和 C/C 等编译型语言的性能与安…

设计模式:工厂方法模式

工厂模式属于创建型模式&#xff0c;也被称为多态工厂模式&#xff0c;它在创建对象时提供了一种封装机制&#xff0c;将实际创建对象的代码与使用代码分离&#xff0c;有子类决定要实例化的产品是哪一个&#xff0c;把产品的实例化推迟到子类。 使用场景 重复代码 : 创建对象…

一文读懂mysql的锁

提起mysql的锁&#xff0c;你是否会似懂非懂&#xff0c;最常听人提起的就是乐观锁&#xff0c;悲观锁、排他锁、共享锁 悲观锁是用 select c form T for update然后等待提交实现的&#xff0c;但是你知道吗&#xff0c;其实排他锁和悲观锁其实是一回事&#xff01;&#xff0…

redis-4 搭建redis集群

1.为什么需要redis集群&#xff1f; Redis 集群提供了高可用性、横向扩展和数据分片等功能&#xff0c;使得 Redis 能够应对大规模的数据存储和高并发访问的需求。以下是一些需要使用 Redis 集群的常见情况&#xff1a; 高可用性&#xff1a;通过在多个节点之间进行数据复制和…

假期刷题打卡--Day17

1、MT1163孪生质数 在质数中&#xff0c;若两个质数之差为2,我们称之为孪生质数,例如&#xff08;3、5&#xff09;&#xff08;5、7&#xff09;&#xff0c;输入2个正整数&#xff0c;判断他是不是孪生质数&#xff0c;输出YES或者NO。 格式 输入格式&#xff1a; 输入整…

求职就业,你需要了解人才测评的应用流程

很多求职者心中都有一个困惑&#xff0c;不知道该人才测评的流程是如何进行&#xff0c;只知道完成基本的测试&#xff0c;完全不明白测试过程如何进行。但实际上&#xff0c;这个过程十分简单&#xff0c;并不像传说中那样神秘&#xff0c;很多人都能够弄懂过程的原理。一旦熟…

一文搞懂如何开通miniQMT(全网最清晰版本)

前言 本篇文章&#xff0c;目的是说清楚如何开通miniQMT&#xff0c;给出最清晰的开通路径。关于miniQMT是什么&#xff0c;可以参考我之前的文章《什么是miniQMT?》 1、开通券商版QMT 首先&#xff0c;迅投的QMT软件&#xff0c;与大部分券商都存在深度合作。也就是说&…

hadoop面试题

0. 思维导图 1. HDFS 1. HDFS的架构♥♥ HDFS主要包括三个部分&#xff0c;namenode,datanode以及secondary namenode。这里主要讲一下他们的作用&#xff1a;namenode主要负责存储数据的元数据信息&#xff0c;不存储实际的数据块&#xff0c;而datanode就是存储实际的数据块…

【.NET Core】深入理解C#中的特殊字符

【.NET Core】深入理解C#中的特殊字符 文章目录 【.NET Core】深入理解C#中的特殊字符一、概述二、$-- 字符串内插2.1 内插字符串的结构2.2 内插原始字符串字面量2.3 特殊字符2.4 内插字符串编译 三、-- 逐字字符串标识符四、“”“--原始字符串文本 一、概述 特殊字符是预定义…