【力扣一刷】代码随想录day32(贪心算法part2:122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II )

目录

【122.买卖股票的最佳时机II】中等题

方法一  贪心算法

方法二  动态规划

【55. 跳跃游戏】中等题

【尝试】 递归 (超时)

方法  贪心算法

【45.跳跃游戏II】中等题

方法  贪心算法


【122.买卖股票的最佳时机II】中等题(偏简单)

方法一  贪心算法

思路:

1、局部最优:截止到当天能赚到的最大利润

2、全局最优:截止到最后一天能赚到的最大利润就是全局最大利润

例子:上升就是赚钱机会,贪心地将每个赚钱机会把握住,获取赚到的钱的总和即可

class Solution {public int maxProfit(int[] prices) {int res = 0;for (int i = 0; i < prices.length - 1; i++){int delta = prices[i + 1] - prices[i];if (delta > 0) res += delta; // 贪心算法,不放过截止到现在的所有赚钱机会}return res;}
}
  • 时间复杂度: O(n),for循环遍历一次数组
  • 空间复杂度: O(1),没有额外的空间开销

方法二  动态规划

思路:

1、确定dp[i]的含义:截止到第i天赚到的最多的钱

2、确定递推关系:dp[i] = dp[i-1] + today

3、确定初始值:第一天赚到的最多的钱肯定是0,即dp[0] = 0

class Solution {public int maxProfit(int[] prices) {int dp = 0;for (int i = 1; i < prices.length; i++){// 今天之前赚到的最多的钱 + 今天当天赚到最多的钱 = 包括今天在内已经赚到的最多的钱int today = prices[i] - prices[i-1] > 0 ? prices[i] - prices[i-1] : 0;dp += today;}return dp;}
}
  • 时间复杂度: O(n),for循环遍历一次数组
  • 空间复杂度: O(1),dp[i]只与dp[i-1]有关,只用一个变量记录值即可


【55. 跳跃游戏】中等题

【尝试】 递归 (超时)

思路:

1、确定参数和返回值:传入数组和起跳索引作为参数,返回值为起跳索引能否到达最后一个索引的判断结果。

2、确定终止条件:当起跳索引为最后一个索引时,证明能够到达最后一个下标,返回true

3、确定单层递归逻辑:先获取当前起跳索引 start 能跳到的范围,一般是 [start + 1, start + nums[start]]。只需要遍历这个范围,如果这个范围内存在能否到达最后一个索引的索引即可返回true;for遍历结束后,在这个范围内的索引都无法到达最后一个索引,则该起跳索引无法到达最后一个索引,返回false。 

class Solution {public boolean canJump(int[] nums) {return canJumpToEnd(nums, 0);}public boolean canJumpToEnd(int[] nums, int start){// 起跳索引到达最后一个索引if (start == nums.length - 1) return true;// 计算起跳索引能到达的索引范围,如果索引范围超过数组的可索引范围,则取数组最大索引int longest = Math.min(start + nums[start], nums.length - 1);// for循环遍历每个start可到达的索引,如果有一个索引能到达最后一个索引就返回truefor (int i = start + 1; i <= longest; i++){if (canJumpToEnd(nums, i)) return true;}// for遍历完之后都到不了,则说明该索引无法到达最后一个索引,返回falsereturn false;}
}

方法  贪心算法

思路:

1、局部最优即获取遍历到的索引的最大覆盖范围,全局最优即遍历到最后相当于获取所有索引的最大覆盖范围,只要判断全局覆盖范围是否包含最后一个索引即可。

2、for循环遍历最大覆盖范围,每遍历一个索引就更新一次最大覆盖范围,判断最大覆盖范围是否包含了最后一个索引,是则返回true;

3、如果在最大覆盖范围内的索引都遍历完了也到达不了最后一个索引,则返回false

class Solution {public boolean canJump(int[] nums) {int longest = 0;for (int i = 0; i <= longest; i++){longest = Math.max(longest, i + nums[i]); // 更新最大覆盖范围if (longest >= nums.length - 1){  // 如果能到达最后一个索引,则返回true,还可以避免数组索引越界return true;}}return false; // 如果在最大覆盖范围内的索引都遍历完了也到达不了最后一个索引,则返回false}
}
  • 时间复杂度: O(n),for循环遍历一次数组
  • 空间复杂度: O(1)


【45.跳跃游戏II】中等题(偏难)

方法  贪心算法

思路:

1、贪心策略:每跳一步,就贪心地获取这一步能到达的最远处,如果最远处超过最后一个索引,则一共所跳的次数就是最少的次数。

2、关键:如何获取每跳一步能到达的最远处?

例子:[2,3,1,2,4,2,3]      结果:3

  • 第①次跳,只能从 i = 0 处开始跳,所以第①次跳能到达的最远处为 i = 2,最远处还没越过最后一个索引。
  • 第②次跳,如果从 i = 1 处开始跳,能到达的最远处为 i = 4;如果从 i = 2 处开始跳,能到达的最远处为 i = 3;所以综合来看,第②次跳能到达的最远处为 i = 4,最远处还没越过最后一个索引。
  • 第③次跳,如果从 i = 3 处开始跳,能到达的最远处为 i = 5;如果从 i = 4 处开始跳,能到达的最远处为 i = 8;所以综合来看,第③次跳能到达的最远处为 i = 8,已经越过了最后一个索引 i = 6。

3、步骤分析:

  • 获取当前能到达的最远处。

  • 判断当前能到达的最远处是否能到达最后一个索引,如果计算完下一跳的边界前(或到达当前跳的边界前)就已经能到达最后一个索引,则还需要再跳一次再返回结果。

  • 如果上一跳能跳到的位置已经遍历完了(到达上一轮的边界时),则开启新一跳,次数+1,并设置新一跳的边界。

class Solution {public int jump(int[] nums) {int longest = 0;  // 用于记录已经遍历过的索引能到达的最远处int end = 0;  // 用于记录上一跳的边界/能到达的最远处int cnt = 0;  // 用于记录所跳的次数 for (int i = 0; i < nums.length - 1; i++){// 获取当前能到达的最远处longest = Math.max(longest, i + nums[i]);// 判断当前能到达的最远处是否能到达最后一个索引if (longest >= nums.length - 1){cnt++; // 如果计算完下一跳的边界前就已经能到达最后一个索引,则还需要再跳一次再返回结果break;}// 如果上一跳能跳到的位置已经遍历完了(到达上一轮的边界),则开启新一跳并设置新一跳的边界if (i == end){cnt++; // 开启新一跳,次数+1end = longest;  // 更新新一跳能到达的最远处/边界}}return cnt;}
}
  • 时间复杂度: O(n),for循环遍历一次数组
  • 空间复杂度: O(1)

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

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

相关文章

神州数码命令:路由器配置

路由器配置 一、路由器基本配置 1、进入特权模式&#xff1a; Router>en2、进入全局配置模式&#xff1a; Router#config3、定义路由器的名字为DCR &#xff1a; Router(Config)#hostname DCR4、特权用户的口令&#xff1a; DCR (Config)#enable password 1234565、启…

杰理AC695N_SDK里面的hid_user.c测试通过蓝牙hid通道控制手机屏幕滑动或者音量增减

该文件sdk的hid_user.c的最下面有这样的描述,告诉开发者应该怎么打开自定义的蓝牙hid报告描述符 // 用户修改成自定义的描述符说明 // 1、在void bredr_handle_register();中调用user_hid_descriptor_init; // 2、user_hid_sdp_init换成自己的表 // 3、文件上方HID_CHANGE_DES…

Java的异常机制

异常机制 三种类型 检查型异常&#xff1a;程序员无法预见的运行时异常&#xff1a;在编译时会被忽略错误ERROR&#xff1a;错误在代码中被忽略&#xff0c;在编译时检查不到 异常处理机制 抛出异常捕获异常异常处理的五个关键字&#xff1a;try&#xff0c;catch&#xff…

SpringClound Eureka 1.9.12 版本源码解析

Eureka启动&#xff0c;原生启动与SpringCloudEureka启动异同 我们先看看作为原生的EurekaServer启动的过程&#xff0c;作为一个Servlet应用&#xff0c;他的启动入口就是他的主要ServletContextListener类&#xff08;这里是EurekaBootStrap&#xff09;的contextInitialize…

质因数个数(acwing,蓝桥杯)

题目描述&#xff1a; 给定正整数 n&#xff0c;请问有多少个质数是 n 的约数。 输入格式&#xff1a; 输入的第一行包含一个整数 n。 输出格式&#xff1a; 输出一个整数&#xff0c;表示 n 的质数约数个数。 数据范围&#xff1a; 对于 30% 的评测用例&#xff0c;1≤…

CasaOS玩客云部署AList+Aria2结合内网穿透实现公网离线下载文件至网盘

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-cdH8fnSF05FmvunX {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Day34|贪心算法part03:1005.K次取反后最大化的数组和、134. 加油站、135.分发糖果

1005. K次取反后最大化的数组和 按照“绝对值”从大到小排序&#xff0c;如果数字小于0将其翻转&#xff0c;最后检查k有没有用完&#xff0c;没用完就反复翻转绝对值最小的数。 class Solution {public int largestSumAfterKNegations(int[] nums, int k) {int sum 0;nums …

Circuits--Sequential--More circuits

1. Rule 90 module top_module(input clk,input load,input [511:0] data,output [511:0] q ); always(posedge clk)beginif(load)q<data;elsebeginq<{1b0,q[511:1]}^{q[510:0],1b0}; //左邻居矩阵^右邻居矩阵endendendmodule 2. Rule110 module top_module(input clk,…

数据仓库发展历史与架构演进

从1990年代Bill Inmon提出数据仓库概念后经过四十多的发展&#xff0c;经历了早期的PC时代、互联网时代、移动互联网时代再到当前的云计算时代&#xff0c;但是数据仓库的构建目标基本没有变化&#xff0c;都是为了支持企业或者用户的决策分析&#xff0c;包括运营报表、企业营…

深入理解Python中的JSON处理

目录 一、引言 二、JSON简介 2.1 基本规则&#xff1a; 2.2 写法示例&#xff1a; 对象&#xff1a; 数组 数值 字符串 布尔值和null&#xff1a; 三、Python中的JSON 3.1 序列化和反序列&#xff1a; 3.2 Python json模块概览 3.3 读取JSON数据 3.4 写入JSON数据…

MYSQL 5.7重置root密码

Mysql 5.7重置root密码 如果您忘记了MySQL 5.7的root密码&#xff0c;可以通过以下步骤重置&#xff1a; 停止MySQL服务。在命令行中输入以下命令&#xff1a; systemctl stop mysqld启动MySQL服务并跳过授权表。在命令行中输入以下命令&#xff1a; mysqld_safe --skip-gra…

前端小白的学习之路(Vue2 一)

提示&#xff1a;初学vue,vue2好上手一点&#xff0c;记录笔记&#xff1a;vue的概念,声明式编程与命令式编程的区别&#xff0c;vue的基本使用&#xff0c;模板语法&#xff0c;常用指令 目录 一、什么是vue 二、声明式编程与命令式编程 1.命令式编程 2.声明式编程 三、v…

聚类分析 | 聚类有效性评价指标外部NMI(MATLAB)

指标解释 聚类有效性评价指标中的外部NMI(Normalized Mutual Information,归一化互信息)是一种常见的外部有效性指标,用于评估聚类结果与真实标签之间的相似度。NMI从信息论的角度出发,衡量两个聚类结果的共享信息量。 NMI的计算基于聚类结果和真实标签之间的互信息以及…

Vue.nextTick() 使用场景及实现原理

Vue.nextTick() 基本使用 作用&#xff1a; 等待下一次 DOM 更新刷新的工具方法。 为什么需要用到Vue.nextTick()&#xff1f; 当你在 Vue 中更改响应式状态时&#xff0c;最终的 DOM 更新并不是同步生效的&#xff0c;而是由 Vue 将它们缓存在一个队列中&#xff0c;直到下一…

tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图

文章目录 前言一、实现步骤1. 获取所需特征点的索引2. 使用opencv.js 计算俯仰角、水平角和翻滚角cv.solvePnP介绍cv.solvePnP原理运行代码查看效果 3.绘制姿态示意直线添加canvas元素计算姿态直线坐标并绘制 总结 前言 在计算机视觉领域&#xff0c;估算脸部姿态是一项具有挑…

注入类型(二)

一、二次注入 原理 在第一次进行数据库插入数据的时候&#xff0c;使用了addslashes等函数对其中的特殊字符进行了转义&#xff0c;但是addslashes有一个特点就是虽然参数在过滤后会添加 "\" 进行转义&#xff0c;但是 "\" 并不会插入到数据库中&#xff…

Dubbo 负载均衡

Dubbo 负载均衡 1、什么是负载均衡&#xff1f; 负载均衡是在支持应用程序的资源池中平均分配网络流量的一种方法。 现代应用程序必须同时处理数百万用户&#xff0c;并以快速、可靠的方式将正确的文本、视频、图像和其他数据返回给每个用户。 为了处理如此高的流量&#x…

(虚拟DOM)前端八股文修炼Day10

一 虚拟 DOM 是什么 虚拟 DOM (Virtual DOM) 本质上是真实 DOM 的一个轻量级的 JavaScript 表示形式。它是一个在内存中的抽象&#xff0c;用于描述真实 DOM 的结构和内容。虚拟 DOM 提供了一种机制&#xff0c;允许开发者通过操作 JavaScript 对象来间接更新页面&#xff0c;…

GitHub教程:最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程)

&#x1f42f; GitHub教程&#xff1a;最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程) &#x1f4c1; 文章目录 &#x1f42f; GitHub教程&#xff1a;最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图…

【Leetcode】【240406】1249. Minimum Remove to Make Valid Parentheses

其实大部分是东京时间第二天凌晨才做的- -但国际服刷新比较晚 BGM&#xff1a;刀剑如梦 Decsripition Given a string s of ‘(’ , ‘)’ and lowercase English characters. Your task is to remove the minimum number of parentheses ( ‘(’ or ‘)’, in any position…