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

122.买卖股票的最佳时机 II

这题感觉还是偏简单的,主要是要理解一点:本题中股票能当天买入当天卖出能得知明天的股票价格

这个设定省去了很多麻烦,每天先无脑买入即可,如果第二天价格更高就第二天卖出,如果第二天价格更低则买入当日就卖出。

以这种策略,如果股价持续走高能吃到所有利润,如果股价持续走低也不会有任何亏损

对这种思路进行抽象,画出价格变化的折线图,累计所有上坡即可

int maxProfit(vector<int>& prices) {int pre = prices[0];int cur;int ans = 0;for (int i = 1; i < prices.size(); ++i) {cur = prices[i];if (cur > pre)ans += cur - pre;pre = cur;}return ans;
}

55.跳跃游戏

思索良久还是用递归做了(战胜了5%的用户,我真是太棒了)

递归写法:

如果一个节点能直接跳到终点,就将其作为新的终点,判断其他节点能否跳到该节点。不断将“终点”前推,如果能到达起点,说明存在起点到终点的完整路径

bool canJumpSub(vector<int>& nums, int back, vector<bool>& used) {// 终止条件:如果递归到了起点,说明连成了一条起点到终点的完整路径,返回trueif (back == 0)return true;vector<int> sub;// 如果从节点能直接跳到终点,则存入数组for (int i = 0; i < back; ++i) {if (back - i <= nums[i] && !used[i])sub.push_back(i);}for (int backIndex : sub) {// 一个节点只进行一次判断used[backIndex] = true;// 递归判断前面是否有节点能到达该节点if (canJumpSub(nums, backIndex, used)) {return true;}}return false;
}bool canJump(vector<int>& nums) {vector<bool> used(nums.size(), false);bool ans = canJumpSub(nums, nums.size() - 1, used);return ans;
}

贪心写法:

(真没想到啊,这也太简洁了)

思路:从起点开始逐步扩大覆盖范围,最后判断能否覆盖到终点

bool canJump(vector<int>& nums) {int cover = 0;for (int i = 0; i <= cover; ++i) {// 更新当前节点能覆盖到的最大范围cover = std::max(cover, i + nums[i]);if (cover >= nums.size() - 1)return true;}return false;
}

45.跳跃游戏 II

用递归做完上一题后这题一眼回溯,思路是相同的,多一步用回溯记录最小步数即可

int ans;void canJumpSub(vector<int>& nums, int back, vector<bool>& used, int count) {if (back == 0) {if (count < ans)ans = count;return;}vector<int> sub;for (int i = 0; i < back; ++i) {if (back - i <= nums[i] && !used[i])sub.push_back(i);}for (int backIndex : sub) {used[backIndex] = true;// 使用++count在回溯过程中记录步数canJumpSub(nums, backIndex, used, ++count);}return;
}

贪心写法:

思路与上一题的贪心有点类似,但写了半天一直出小问题,老笨比了

这题的重点是理清楚什么时候需要增加步数:到达当前步数下的最大覆盖范围,但尚未到达终点时需要增加步数

int jump(vector<int>& nums) {if (nums.size() == 1)return 0;int count = 0;int cover = 0;		// 实时更新的最大覆盖范围(比当前多走一步能到达的最大范围)int pre = 0;		// 当前步数下能到达的最大范围for (int i = 0; i < nums.size(); ++i) {cover = std::max(i + nums[i], cover);// 增加步数的时机:到达当前步数下的最大覆盖范围,但尚未到达终点时增加步数(想要到达之后的元素,步数必须+1)if (i == pre) {++count;// 步数+1后,更新当前步数下的最大范围pre = cover;// 如果多走一步后能到达终点了,直接退出并返回结果if (pre >= nums.size() - 1)break;}}return count;
}

(贪心难道真的是没套路的吗,做了两天完全理不清楚,甚至感觉每题都是不一样的题型)

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

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

相关文章

IDEA玩转Git

GIT 基本概念 本地版本控制 git add git commit git checkout Git - Reference 向日葵下载地址:向日葵远程控制app官方下载 - 贝锐向日葵官网 远程库

【Java】笔记:JDBC中Statement常用的几个执行函数

1.executeQuery(String sql): ResultSet 用于执行查询语句&#xff08;SELECT&#xff09;&#xff0c;返回一个 ResultSet 对象&#xff0c;该对象包含了查询结果的数据。可以通过 ResultSet 提供的方法来获取查询结果。 //声明statement Statement statement connection.c…

神要封,仙要修

&#xff08;1&#xff09;人间之战 我记得&#xff0c;那一年&#xff0c;西方的胡夫正要开始修建他的死后极乐世界&#xff1a;金字塔。 那一年&#xff0c;东方也爆发了一场人间大战。 很久很久以前&#xff0c;一支来自乌拉尔山脉南麓脚下的游牧部落&#xff0c;骑着马赶着…

ATCoder Beginner Contest 340 A~G

A.Arithmetic Progression&#xff08;模拟&#xff09; 题意&#xff1a; 输出首项为 a a a&#xff0c;末项为 b b b&#xff0c;公差为 d d d的等差数列。 分析&#xff1a; 按照要求模拟。 代码&#xff1a; #include <bits/stdc.h>using namespace std;int ma…

书城项目历程记录2|最后阶段记录

2024年1月31日 p270-276 1.免用户名登录和注销&#xff08;知识点cookie和session&#xff09; 在学习了cookie和session之后&#xff0c;实现了免用户名登录和注销操作。 免用户名就是在本次session登录成功之后&#xff0c;对session进行setAttribute操作&#xff0c;jsp文…

【C++】模板(超详细!!!!!!)

文章目录 前言1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则2.6 声明和定义分离 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化 4. 模板分离编译4.1 什么是分离编译4.2 模板的分离编译 总结 前言 …

记录一下最近遇到的几个二叉树的题型(附好用的遍历模板)

107. 二叉树的层序遍历 II 102. 二叉树的层序遍历 987. 二叉树的垂序遍历 以上三题可共用一个模板&#xff08;dfs记录数的col和row)&#xff0c;不同之处就是使用哈希表的时候调整一下key和value&#xff1a; # Definition for a binary tree node. # class TreeNode: # …

【Linux笔记】进程间通信之管道

一、匿名管道 我们在之前学习进程的时候就知道了一个概念&#xff0c;就是进程间是互相独立的&#xff0c;所以就算是两个进程是父子关系&#xff0c;其中一个进程退出了也不会影响另一个进程。 也因为进程间是互相独立的&#xff0c;所以两个进程间就不能直接的传递信息或者…

网络安全威胁,如何解决缓冲区溢出攻击

目录 一、什么是网络安全 二、什么是缓冲区 三、缓冲区溢出 四、缓冲区溢出攻击的类型 一、什么是网络安全 网络安全&#xff08;Network Security&#xff09;指的是保护计算机网络及其相关设备、系统和数据免受未经授权访问、破坏、篡改、窃取或滥用的威胁和攻击。随着网…

【doghead】VS2022 win11 安装配置WSL2 以编译linux端的cmake项目并运行1

Visual Studio 2022 在Windows上编译调试WSL2 CMake Linux工程 好像是我自己的vs2022的一个插件支持rust https://github.com/kitamstudios/rust-analyzer.vs/blob/master/PREREQUISITES.md Latest rustup (Rust Toolchain Installer). Install from here. Welcome to Rust!Th…

ElasticSearch分词器和相关性详解

目录 ES分词器详解 基本概念 分词发生时期 分词器的组成 切词器&#xff1a;Tokenizer 词项过滤器&#xff1a;Token Filter 停用词 同义词 字符过滤器&#xff1a;Character Filter HTML 标签过滤器&#xff1a;HTML Strip Character Filter 字符映射过滤器&#x…

『 C++ - STL 』位图(BitMap)与布隆过滤器(Bloom Filter)

文章目录 &#x1f9f8; 位图(BitMap)概念&#x1f9f8; 位图的实现&#x1fa85; 总体框架&#x1fa85; 位图的数据插入&#x1f9e9; 左移操作与右移操作的区别 &#x1fa85; 位图的数据删除&#x1fa85; 位图的数据查找&#x1fa85; 位图整体代码(供参考) &#x1f9f8;…

(06)Hive——正则表达式

Hive版本&#xff1a;hive-3.1.2 一、Hive的正则表达式概述 正则表达式是一种用于匹配和操作文本的强大工具&#xff0c;它是由一系列字符和特殊字符组成的模式&#xff0c;用于描述要匹配的文本模式。 Hive的正则表达式灵活使用解决HQL开发过程中的很多问题&#xff0c;本篇文…

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

122.买卖股票的最佳时机II 完成 思路&#xff1a; 把每天的利润最大化&#xff0c;即可达到总利润的最大化。 把利润拆分到每一天&#xff0c;能获利就买。 代码 class Solution {public int maxProfit(int[] prices) {int res 0;for (int i 0; i < prices.length-1; i…

Activation of network connection failed(ubuntu连不上网)

ubuntu连不上网&#xff0c;看了好几个方法找到个有用的记录一下 1. 还原默认设置 2. 更改适配器&#xff1a;加上vmware bridge protocol

使用Vue.js输出一个hello world

导入vue.js <script src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script> 创建一个标签 <div id"app">{{message}}</div> 接管标签内容&#xff0c;创建vue实例 <script type"text/javascript">va…

关于Django的中间件使用说明。

目录 1.中间件2. 为什么要中间件&#xff1f;3. 具体使用中间件3.1 中间件所在的位置&#xff1a;在django的settings.py里面的MIDDLEWARE。3.2 中间件的创建3.3 中间件的使用 4. 展示成果 1.中间件 中间件的大概解释&#xff1a;在浏览器在请求服务器的时候&#xff0c;首先要…

【无标题】JAVA学习-集合.编写equals和hashCode

编写equals()和hashCode()方法需要遵循以下原则&#xff1a; 1. equals()方法&#xff1a; - 使用instanceof关键字检查传入的对象是否为当前类的实例。 - 检查传入的对象是否为null。 - 检查传入的对象的类型是否与当前对象的类型相同。 - 比较对象的属性是否相等&#x…

如何在 Ubuntu VPS 上使用 Celery 与 RabbitMQ 来做队列

简介 异步或非阻塞处理是一种将某些任务的执行与程序的主要流程分离的方法。这为您提供了几个优势&#xff0c;包括允许用户界面代码在没有中断的情况下运行。 消息传递是程序组件用来通信和交换信息的一种方法。它可以同步或异步实现&#xff0c;并且可以允许离散进程进行无问…

2月14日作业

1、安装tftp服务器和nfs服务器&#xff0c;准备需要下载到开发板文件&#xff0c;存放在指定下载文件夹下&#xff0c;准备需要挂载到开发板文件夹&#xff0c;存放在指定挂载文件夹中。 2、ubuntu和开发板组网&#xff0c;关闭防火墙&#xff0c;关闭杀毒软件&#xff0c;配置…