代码随想录算法训练营_day28

题目信息 122. 买卖股票的最佳时机 II

  • 题目链接: https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/
  • 题目描述:
    给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

贪心算法

这道题目可能我们只会想,选一个低的买入,再选个高的卖,再选一个低的买入…循环反复。

如果想到其实最终利润是可以分解的,那么本题就很容易了!

如何分解呢?

假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。

相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。

此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!

那么根据 prices 可以得到每天的利润序列:(prices[i] - prices[i - 1])…(prices[1] - prices[0])。

如图:

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

一些同学陷入:第一天怎么就没有利润呢,第一天到底算不算的困惑中。

第一天当然没有利润,至少要第二天才会有利润,所以利润的序列比股票序列少一天!

从图中可以发现,其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间

那么只收集正利润就是贪心所贪的地方!

局部最优:收集每天的正利润,全局最优:求得最大利润

局部最优可以推出全局最优,找不出反例,试一试贪心!

代码实现

public int maxProfit(int[] prices){  int result = 0;  for (int i = 1;i < prices.length;i++){  result += Math.max((prices[i] - prices[i - 1]),0);  }  return result;  
}

题目信息 55. 跳跃游戏

  • 题目链接: https://leetcode.cn/problems/jump-game/
  • 题目描述:
    给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

解题思路

每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。

贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点

局部最优推出全局最优,找不出反例,试试贪心!

如图:

i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。

而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。

如果 cover 大于等于了终点下标,直接 return true 就可以了。

代码实现

public boolean canJump(int[] nums) {  if (nums.length == 1) {  return true;  }  //覆盖范围, 初始覆盖范围应该是0,因为下面的迭代是从下标0开始的  int coverRange = 0;  //在覆盖范围内更新最大的覆盖范围  for (int i = 0; i <= coverRange; i++) {  coverRange = Math.max(coverRange, i + nums[i]);  if (coverRange >= nums.length - 1) {  return true;  }  }  return false;  
}

解法二: {{解法名称}}

解题思路

代码实现

public class Solution {public {{returnType}} {{methodName}}({{parameters}}) {// 在此处编写Java代码}
}

题目信息 45. 跳跃游戏 II

  • 题目链接: https://leetcode.cn/problems/jump-game-ii/description/
  • 题目描述:
    给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

解题思路

贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最少步数。

思路虽然是这样,但在写代码的时候还不能真的能跳多远就跳多远,那样就不知道下一步最远能跳到哪里了。

所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!

这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖

如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。

如图:

45.跳跃游戏II

图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)

#方法一

从图中可以看出来,就是移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。

这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时

  • 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
  • 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了

代码实现

public int jump(int[] nums) {  if (nums == null || nums.length == 0 || nums.length == 1) {  return 0;  }  //记录跳跃的次数  int count=0;  //当前的覆盖最大区域  int curDistance = 0;  //最大的覆盖区域  int maxDistance = 0;  for (int i = 0; i < nums.length; i++) {  //在可覆盖区域内更新最大的覆盖区域  maxDistance = Math.max(maxDistance,i+nums[i]);  //说明当前一步,再跳一步就到达了末尾  if (maxDistance>=nums.length-1){  count++;  break;        }  //走到当前覆盖的最大区域时,更新下一步可达的最大区域  if (i==curDistance){  curDistance = maxDistance;  count++;  }  }  return count;  
}

题目信息 1005. K 次取反后最大化的数组和

  • 题目链接: https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/

  • 题目描述:
    给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

  • 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。

重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。

解题思路

  • 第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
  • 第二步:从前向后遍历,遇到负数将其变为正数,同时K–
  • 第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完
  • 第四步:求和

代码实现

public int largestSumAfterKNegations(int[] nums, int k) {  if (nums.length == 1) return nums[0];  // 排序:先把负数处理了  Arrays.sort(nums);  for (int i = 0; i < nums.length && k > 0; i++) { // 贪心点, 通过负转正, 消耗尽可能多的k  if (nums[i] < 0) {  nums[i] = -nums[i];  k--;  }  }  // 退出循环, k > 0 || k < 0 (k消耗完了不用讨论)  if (k % 2 == 1) { // k > 0 && k is odd:对于负数:负-正-负-正  Arrays.sort(nums); // 再次排序得到剩余的负数,或者最小的正数  nums[0] = -nums[0];  }  // k > 0 && k is even,flip数字不会产生影响: 对于负数: 负-正-负;对于正数:正-负-正   int sum = 0;  for (int num : nums) { // 计算最大和  sum += num;  }  return sum;  
}

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

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

相关文章

Springboot-RequestContextHolder

RequestContextHolder 是 Spring 框架中的一个类,主要用于在多线程环境中存储和访问 HTTP 请 求的上下文信息。它允许在 Spring 应用程序中从任何位置访问当前请求的相关信息,比如 HTTP 头部、会话数据等,而无需将请求对象直接传递到每个方法中。 主要用途 存储请求上下…

Seata 学习

简介 我们都知道 Seata 是一个分布式事务的解决方案&#xff0c;今天我们就来带大家了解一下什么是分布式事务&#xff0c;首先我们先来了解一下基础的知识——事务&#xff0c;我们先来了解一下事务的概念是什么。 基本概念 事务四部分构成— ACID&#xff1a; A(Atomic)&…

小程序路由传参和获取页面栈方法

路由方法 navigateTo, redirectTo 只能打开非 tabBar 页面。switchTab 只能打开 tabBar 页面。reLaunch 可以打开任意页面。页面底部的 tabBar 由页面决定&#xff0c;即只要是定义为 tabBar 的页面&#xff0c;底部都有 tabBar。调用页面路由带的参数可以在目标页面的onLoad中…

matlab 计算复共轭

目录 一、概述1、算法概述2、主要函数二、代码示例1、求复数的复共轭2、求矩阵中复数值的复共轭三、参考链接本文由CSDN点云侠翻译,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、概述 1、算法概述 2、主要函数 Zc = conj(Z)返回 Z …

【python】Python中小巧的异步web框架Sanic快速上手实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

理解torch.argmax() ,我是错误的

torch.max() import torch# 定义张量 b b torch.tensor([[1, 3, 5, 7],[2, 4, 6, 8],[11, 12, 13, 17]])# 使用 torch.max() 找到最大值 max_indices torch.max(b, dim0)print(max_indices) 输出&#xff1a;>>> print(max_indices) torch.return_types.max( valu…

【13.3 python中的高级文件操作】

python中的高级文件操作 在Python中&#xff0c;除了基本的文件读写和目录操作外&#xff0c;还有一些高级的文件和目录操作&#xff0c;如删除文件、重命名文件和目录、以及获取文件的基本信息等。这些操作通常通过os模块和pathlib模块来实现。下面我将详细介绍这些操作&#…

Git在IDEA中的集成操作(附步骤图)

1.先做适配操作&#xff0c;将安装的Git软件关联到IDEA中 点击Test之后若成功会显示出Git版本&#xff1a; 2.创建版本仓库 3.创建新的版本 3.1将文件提交到暂存区(不重要) 第一种方式&#xff1a;菜单栏提交 第二种方式&#xff1a;项目右键提交 4.查看历史版本信息 目…

整合sentinel遇到的小问题

1.运行jar包 &#xff0c;端口为默认8080 正确命令 java -Dserver.port8090 -Dcsp.sentinel.dashboard.server127.0.0.1:8090 -Dproject.namesentinel-dashboard -jar sentinel-dashboard-1.8.6.jar -D这些指令要在 -jar前面 在宝塔部署时&#xff0c;直接复制到运行命令后…

acl2的安装和vescmul的运行

使用sat一类的求解器验证乘法器&#xff0c;通常无法收敛&#xff0c;Mertcan Temel博士基于acl2实现了数字电路中乘法器的验证。下面简单介绍一下acl2的安装、vescmul的运行。 1.下载acl2 git clone https://github.com/acl2/acl2.git 2.acl2基于lisp编程语言实现&#xff…

Sparse Kernel Canonical Correlation Analysis

论文链接&#xff1a;https://arxiv.org/pdf/1701.04207 看这篇论文终于看懂核函数了。。谢谢作者

基于无人机边沿相关 ------- IBUS、SBUS协议和PPM信号

文章目录 一、IBUS协议二、SBUS协议三、PPM信号 一、IBUS协议 IBUS&#xff08;Intelligent Bus&#xff09;是一种用于电子设备之间通信的协议&#xff0c;采用串行通信方式&#xff0c;允许多设备通过单一数据线通信&#xff0c;较低延迟&#xff0c;支持多主机和从机结构&a…

SpringBoot集成kafka-监听器注解

SpringBoot集成kafka-监听器注解 1、application.yml2、生产者3、消费者4、测试类5、测试 1、application.yml #自定义配置 kafka:topic:name: helloTopicconsumer:group: helloGroup2、生产者 package com.power.producer;import com.power.model.User; import com.power.uti…

C++11详解 (右值引用、可变参数模板、emplace_back、lambda表达式、function、bind)

目录 简介 左值引用与右值引用 左值引用与右值引用是什么 左值引用与右值引用的比较 右值引用的使用场景与C11中STL的新变化 完美转发 新的类功能 可变参数模板 可变参数模板的应用——emplace_back lambda表达式 包装器 function bind 结语 简介 在过往&#xf…

UGUI空白可点击组件,减少重绘

如果使用image alpha 0,会导致overDraw,直接清空mesh,不绘制即可避免 #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; using UnityEngine.UI; namespace UnityGameFramework { [AddComponentMenu("Game/UI/GameEmpty4Raycast")] [Requir…

基于vue框架的毕业设计选题系统bqx47(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,指导老师,课题信息,类型,选题信息 开题报告内容 基于Vue框架的毕业设计选题系统 开题报告 一、引言 毕业设计选题是高等教育中极为关键的一环&#xff0c;它不仅关乎学生未来研究的方向与深度&#xff0c;也是培养其创新思维和实…

Node.js-身份证号实名认证-小程序实名认证接口集成方法

使用身份证实名认证API之前&#xff0c;首先要确保已有一个可运行的开发环境&#xff0c;例如小程序或应用程序开发环境。这将是集成和测试API的基础。在应用中设计一个用户输入界面&#xff0c;用于用户输入姓名和身份证号码&#xff0c;同时设计提交按钮以触发验证流程。 在选…

Java 调用三方文件上传接口

Java 调用三方文件上传接口 url 为三方接口地址files为上传的文件信息&#xff0c;类型为File类型 // 构造MultiResource MultiResource multiResource new MultiResource(files.stream().map(multipartFile -> {try {return new InputStreamResource(Files.newInputStr…

SSRF漏洞与redis未授权访问的共同利用

1.利用靶场Pikachu来认识SSRF漏洞 1.什么是SSRF SSRF漏洞允许攻击者通过向服务器发起请求来伪造请求。这种漏洞的核心在于攻击者能够控制服务器向任意目标地址发起请求&#xff0c;而这些请求通常是攻击者无法直接从客户端发起的。 简单来说&#xff0c;假设你的网站有一个功能…

Linux的tmux命令使用

tmux ("terminal multiplexer"的简称), 是一款优秀的终端复用软件&#xff0c;tmux来自于openbsd&#xff0c;采用bsd授权。使用它最直观的好处就是, 通过一个终端登录远程主机并运行tmux后&#xff0c;在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台…