【LeetCode Hot100 贪心算法】 买卖股票的最佳时机、跳跃游戏、划分字母区间

贪心算法

    • 买卖股票的最佳时机
    • 买卖股票的最佳时机II
    • 跳跃游戏
    • 跳跃游戏II
    • 划分字母区间

买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

思路
如果第 i i i 天卖出股票,则最大利润为(该天的股价-前面天数中最小的股价),然后与已知的最大利润比较,如果大于则更新当前最大利润的值。

代码

class Solution {public int maxProfit(int[] prices) {int cost = Integer.MAX_VALUE, profit = 0;for (int i = 0; i < prices.length; i++) {cost = Math.min(cost, prices[i]);profit = Math.max(profit, prices[i] - cost);}return profit;}
}

买卖股票的最佳时机II

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
示例 1:
输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。
最大总利润为 4 + 3 = 7 。

思路
分解成每天都买卖,但是只在最后的结果中加入正的,局部最优->全局最优。

代码
注意 i 从 1 开始

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

跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
示例 1:
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

思路
确定从第一个位置开始,能够跳跃到的范围有多少,如果这个范围能够覆盖到数组的最后一个位置,那么就可以范围true。

代码

class Solution {public boolean canJump(int[] nums) {int cover = 0; // 覆盖范围// 遍历的范围是cover内for (int i = 0; i <= cover; i++) {// 遍历到一个位置,就从上一个cover和该位置能够到达的最远位置取最大值cover = Math.max(cover, i + nums[i]);if (cover >= nums.length - 1) {// 如果能够覆盖到数组的最后一个位置return true;}}return false;}
}

跳跃游戏II

在上一题的基础上,要求返回最少跳跃次数。
示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

思路
在这里插入图片描述
代码

class Solution {public int jump(int[] nums) {int curRight = 0;   // 已经造桥的右端点int nextRight = 0;  // 下一步造桥最远的端点int ans = 0;  // 答案// for 循环中 i < nums.length - 1// 因为开始的时候边界时第0个位置,ans已经加过一次1了,最后末尾的时候不用计算步数了for (int i = 0; i < nums.length - 1; i++) {nextRight = Math.max(nextRight, i + nums[i]);if (i == curRight) {   // 到达已建造的桥的右端点curRight = nextRight;  // 建造桥ans++;}}return ans;}
}

划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。
返回一个表示每个字符串片段的长度的列表。
示例 1:
输入:s = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
划分结果为 “ababcbaca”、“defegde”、“hijhklij” 。
每个字母最多出现在一个片段中。
像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。
示例 2:
输入:s = “eccbbbbdec”
输出:[10]

思路
先用一个hash数组把字符串中每一个字母出现的最远位置下标存储在hash数组中。
遍历字符串,更新当前要划分的区间的最远距离(当前最远距离与该位置字母的最远位置下标取最大值)
然后判断此时的最远位置是否是当前位置,如果是说明已经找到了一个划分的区间。
结合代码随项目的思路来解题

代码

class Solution {public List<Integer> partitionLabels(String s) {int[] hash = new int[26];for (int i = 0; i < s.length(); i++) {// 求某个字母的最远位置;使用hash来记录;// s.charAt(i) - 'a'是字母的索引,i是这个字母目前的最远位置hash[s.charAt(i) - 'a'] = i;}int left = 0, right = 0;List<Integer> ans = new ArrayList<>();for (int i = 0; i < s.length(); i++) {// 现有的右边界和当前位置字母的最远出现位置求maxright = Math.max(right, hash[s.charAt(i) - 'a']);// i == right 说明找到了一个分割点if (i == right) {ans.add(right - left + 1);left = right + 1; }  }return ans;}
}

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

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

相关文章

SQL SERVER__RSN 恢复的深入解析

1. RSN 的工作原理 RSN 是 SQL Server 内部用于跟踪和管理备份和恢复操作顺序的编号。每次数据库备份&#xff08;包括完整备份、差异备份和事务日志备份&#xff09;都会生成一个唯一的 RSN。SQL Server 在恢复过程中使用 RSN 来确保备份文件按正确的顺序应用&#xff0c;从而…

Rabbitmq 具体怎么做到削峰的,是丢弃部分消费吗,有的实际场景是不允许丢弃

在高并发场景中&#xff0c;RabbitMQ 可以通过几种策略来实现 削峰&#xff08;缓解瞬时负载激增&#xff09;&#xff0c;而这些策略并不一定需要丢弃消息。在一些业务场景下&#xff0c;丢弃消息显然是不允许的&#xff0c;因此在这种情况下&#xff0c;可以使用以下方法来确…

如何在 Ubuntu 22.04 上使用 LEMP 安装 WordPress 教程

简介&#xff1a; 本教程旨在指导你如何在 Ubuntu 22.04 上使用 LEMP 栈安装 WordPress。 WordPress 是一个用 PHP 编写的开源内容管理系统。LEMP 栈是 Linux&#xff0c;NGINX&#xff0c;MySQL 和 PHP 的缩写。WordPress 非常用户友好&#xff0c;并提供了多种选项&#xff…

MyBatis深入了解

目录 xml 映射文件中&#xff0c;除了常见的select、insert、update、delete 标签之外&#xff0c;还有哪些标签? Dao 接口的工作原理是什么?Dao 接口里的方法&#xff0c;参数不同时&#xff0c;方法能重载吗? MyBatis 是如何进行分页的?分页插件的原理是什么? 简述 …

Springboot Bean创建流程、三种Bean注入方式(构造器注入、字段注入、setter注入)、循坏依赖问题

文章目录 1 Bean 创建流程1.1 Bean的扫描注册1.2 创建Bean的顺序 2 三种Bean注入方式2.1 构造器注入 | Constructor Injection&#xff08;推荐&#xff09;2.2 字段注入 | Field Injection&#xff08;常用&#xff09;2.3 方法注入 | Setter Injection2.4 三种方式注入顺序 3…

vue实现虚拟列表滚动

<template> <div class"cont"> //box 视图区域Y轴滚动 滚动的是box盒子 滚动条显示的也是因为box<div class"box">//itemBox。 一个空白的盒子 计算高度为所有数据的高度 固定每一条数据高度为50px<div class"itemBox" :st…

STM32小实验2

定时器实验 TIM介绍 TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断…

HTB:Timelapse[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 提取并保存靶机TCP开放端口号 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机UD…

【贵州省】乡镇界arcgis格式shp数据乡镇名称和编码内容下载测评

shp数据字段乡镇名称和编码&#xff0c;坐标是wgs84&#xff0c;数据为SHP矢量格式&#xff0c;下载下来直接加载进ArcMap即可使用 下载地址&#xff1a;https://download.csdn.net/download/zhongguonanren99/14928126

《鸿蒙系统AI技术:筑牢复杂网络环境下的安全防线》

在当今数字化时代&#xff0c;复杂网络环境给智能系统带来了诸多安全挑战&#xff0c;而鸿蒙系统中的人工智能技术却展现出强大的安全保障能力&#xff0c;为用户在复杂网络环境中的安全保驾护航。 微内核架构&#xff1a;安全基石 鸿蒙系统采用微内核架构&#xff0c;将核心…

[免费]微信小程序(高校就业)招聘系统(Springboot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序(高校就业)招聘系统(Springboot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序(高校就业)招聘系统(Springboot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…

“AI智能实训系统:让学习更高效、更轻松!

大家好&#xff0c;作为一名资深产品经理&#xff0c;今天我来跟大家聊聊一款备受瞩目的产品——AI智能实训系统。在这个人工智能技术飞速发展的时代&#xff0c;AI智能实训系统应运而生&#xff0c;为广大学习者提供了全新的学习体验。那么&#xff0c;这款产品究竟有哪些亮点…

Linux下字符设备驱动编写(RK3568)

文章目录 一 基础知识概念特点常见应用场景 二 linux 下的字符设备字符设备在 /dev 目录下用 ls -l 命令查看字符设备文件类型主设备号和次设备号 三 字符驱动模块的编写1. 头文件引入2. 定义错误码枚举3. 设备操作函数定义4. 关键结构体与变量定义5. 驱动入口函数&#xff08;…

Lua语言的数据类型

Lua语言的数据类型详解 Lua是一种轻量级、高效的脚本语言&#xff0c;广泛应用于游戏开发、嵌入式系统等领域。它的灵活性和简洁性是其受欢迎的因素之一。其中&#xff0c;Lua的基本数据类型构成了语言的基础&#xff0c;使得开发者可以更高效地处理各种数据。本文将全面介绍L…

ubuntu20下编译linux1.0 (part1)

author: hjjdebug date: 2025年 01月 09日 星期四 15:56:15 CST description: ubuntu20下编译linux1.0 (part1) 该博客记录了新gcc编译旧代码可能碰到的问题和解决办法, 可留作参考 操作环境: ubuntu20 $ gcc --version gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0 $ as --vers…

C#语言的数据库编程

C#语言的数据库编程 在现代软件开发中&#xff0c;数据库是不可或缺的一部分。无论是企业级应用还是个人项目&#xff0c;数据的存储与管理都是程序的核心功能之一。C#作为一种强类型、面向对象的编程语言&#xff0c;广泛应用于Windows平台的开发&#xff0c;尤其是在构建与数…

前端性能优化全攻略:加速网页加载,提升用户体验

前端性能优化全攻略&#xff1a;加速网页加载&#xff0c;提升用户体验 在当今互联网时代&#xff0c;用户对于网页的加载速度和性能要求越来越高。一个快速响应、流畅加载的网页能够极大地提升用户体验&#xff0c;增加用户留存率和满意度。前端性能优化是实现这一目标的关键…

如何禁用win10个人数据跨境传输

由于2023年起&#xff0c;windows系统将进行个人数据的跨境传输&#xff0c;若您关注个人信息安全&#xff0c;希望阻止该情况&#xff0c;请关注本次分享&#xff0c;并采取以下有效步骤&#xff1a; 1.使用本地账户代替微软账户。首先&#xff0c;您需要关闭"Connected…

【ROS2】RViz2加载URDF模型文件

1、RViz2加载URDF模型文件 1)运行RViz2 rviz22)添加组件:RobotModel 3)选择通过文件添加 4)选择URDF文件,此时会报错,需要修改Fixed Frame为map即可 5)因为没有坐标转换,依然会报错,下面尝试解决 2、运行坐标转换节点 1)运行ROS节点:robot_state_publishe

大数据组件(三)快速入门实时计算平台Dinky

大数据组件(三)快速入门实时计算平台Dinky Dinky 是一个开箱即用的一站式实时计算平台&#xff08;同样&#xff0c;还有StreamPark&#xff09;&#xff0c;以 Apache Flink 为基础&#xff0c;连接数据湖仓等众多框架&#xff0c;致力于流批一体和湖仓一体的建设与实践。 Di…