【Leetcode】top 100 贪心算法

基础知识补充

贪心算法:在对问题求解时,总是做到局部最优

局部最优并不总能获得整体最优解,但通常能获得近似最优解

题目
 121 买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

思路:如果day2价格高于day1价格,就假设day1买入day2卖出计算收益,如果day3价格高于day2价格,得假设day1买入day2不处理day3卖出...即需要记录前置的历史最低价,出现更低的价格时更新,而出现更高的价格时计算收益,出现次高价格的收益低于最高收益,不会被记录;

class Solution(object):def maxProfit(self, prices):""":type prices: List[int]:rtype: int"""buy, sell = prices[0], 0for val in prices:if val > buy: sell = max(val-buy, sell)else: buy = valreturn sell
55 跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

思路:当前坐标元素大于数组长度时,一定能到最后一个下标;否则每一步都跳满,再次判断;若当前坐标元素为0,就选择回退一步,再跳满,否则回退两步再跳满...回退到开头仍无法跳过该处0,则永远不可能到达最后一个下标;

class Solution(object):def canJump(self, nums):""":type nums: List[int]:rtype: bool"""i, n = 0, len(nums)-1while i>=0 and i<n:if nums[i]: i = i+nums[i]else:idx = iwhile idx >= 0:if idx+nums[idx]>i: breakidx -= 1i = idxreturn i>=0

更简洁思路:一次遍历每个元素(除最后),用变量记录当前能到达的最远位置,下标大于最远距离时遍历结束,当遍历结束时判断最远位置是否到达最后一个坐标即可;

class Solution(object):def canJump(self, nums):""":type nums: List[int]:rtype: bool"""distance, n = 0, len(nums)-1for i, val in enumerate(nums):if i > distance: breakdistance = max(distance, i+val)return distance>=n
 45 跳跃游戏II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]

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

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

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

思路:动态规划

dp[i] 表示到达下标 i 的最小跳跃数

转移状态:dp[i] = min(dp[i], dp[k]+1)   k+nums[k]>=i

初始状态:dp[0] = 0

class Solution(object):def jump(self, nums):""":type nums: List[int]:rtype: int"""n = len(nums)dp = [float('inf')]*ndp[0] = 0for i in range(n):for k in range(i):if k+nums[k] >= i:dp[i] = min(dp[i], dp[k]+1)return dp[-1]
# 执行用时过长

动态规划的优化

dp[i] 是一个非降序数组,所以在找dp[k]时只要找到第一个符合条件的k即可;

而且对于递增的 i,k也是递增的,不需要回退到0再遍历;

class Solution(object):def jump(self, nums):""":type nums: List[int]:rtype: int"""n = len(nums)dp = [float('inf')]*ndp[0] = 0k = 0for i in range(1, n):while k+nums[k] < i:k+=1dp[i] = dp[k]+1    # 由于会进行这个+1操作,要么dp[0]=-1,要么遍历跳过nums[0]return dp[-1]

更简洁思路:每次跳跃都要跳到最远

以 [3,1,4,2,8] 为例:3最远可以跳到2,在3-2的范围里搜索下一次能跳跃的最远值;

仍依次遍历数组(除最后),当运动到前一次跳跃的最远值时(边界2),将跳跃次数+1同时更新边界;

class Solution(object):def jump(self, nums):""":type nums: List[int]:rtype: int"""n = len(nums)distance, cnt, end = 0, 0, 0for i in range(n-1):distance = max(distance, i+nums[i])if i == end:cnt+=1end = distancereturn cnt
763 划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。返回一个表示每个字符串片段的长度的列表。

思路片段数尽可能多等于每个片段尽可能短;

对于第一个字符(左界),需要将其最远的同字符(右界)与其共同在一个片段中,然后界内判断还需不需要纳入其他字符的同字符(改变右界)当左右界重合时得到了符合要求的一个最短片段;

因为需要查找同字符的最远位置,事先构造了一个哈希表储存字符和其对应下标;

优化:只保存同字符的最远坐标,可以节省哈希表的空间;

class Solution(object):def partitionLabels(self, s):""":type s: str:rtype: List[int]"""# tmp = []tmp = defaultdict(list)for i in range(len(s)):    # tmp[s[i]] = itmp[s[i]].append(i)left, right, out = 0,0,[]for i in range(len(s)):right = max(right, max(tmp[s[i]]))if i == right: out.append(right-left+1)left, right = i+1, 0return out

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

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

相关文章

《Effective C++》《构造/析构/赋值运算——7、为多态基类声明virtual析构函数》

文章目录 1、term7:Declare destructors virtual in polymorphic base classes2、总结3、相关面试题3.1 析构函数在什么情况下声明为虚函数 4、参考 1、term7:Declare destructors virtual in polymorphic base classes 带有多态性质的基类应该声明一个virtual析构函数&#x…

突破编程_C++_STL教程( find 算法)

1 std::find 算法的概念与用途 std::find 是 C 标准库 <algorithm> 中的一个非常有用的算法。这个算法用于在一个范围内查找指定的元素&#xff0c;并返回该元素的迭代器。如果元素不存在于该范围内&#xff0c;则返回范围的尾迭代器。 std::find 的基本概念是遍历一个…

49 el-input 的 模型 视图 双向同步

前言 这里来看一下 el-input 这边的 数据 和 视图的双向绑定 最开始 我以为 这部分的处理应该是 vue 这边实现的, 但是跟踪调试了一下 发现这部分的处理是业务这边 自己实现的 这部分 还是有一些 值得记录的东西, 从这里 要去理解的而是 vue 这边从宏观的框架上面来说 帮我们…

前端网页之间传递参数

在多页面应用中&#xff0c;我们可能面临着前端页面之间传递参数的情况&#xff0c;在一个页面获取到一些参数信息后&#xff0c;到另一个页面去进行后续处理&#xff0c;需要将前一个页面得到的一些参数带到第二个页面。当参数较少时&#xff0c;可以在跳转第二个页面时通过se…

前端-深入探讨网络面试题

第一关 请求-文件、数据、连接 文件类的请求&#xff1a;加载HTMl、CSS 数据&#xff1a; ajax请求&#xff08;基于HTTP&#xff0c;HTTP基于TCP&#xff09;&#xff0c;如何建立连接的&#xff08;三次握手&#xff0c;为什么不是两次或者四次&#xff09;&#xff0c;sock…

《QT实用小工具·四》屏幕拾色器

1、概述 源码放在文章末尾 该项目实现了屏幕拾色器的功能&#xff0c;可以根据鼠标指定的位置识别当前位置的颜色 项目功能包含&#xff1a; 鼠标按下实时采集鼠标处的颜色。 实时显示颜色值。 支持16进制格式和rgb格式。 实时显示预览颜色。 根据背景色自动计算合适的前景色…

AIGC重塑金融:AI大模型驱动的金融变革与实践

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

学习java第二十七天

Spring框架作为IOC容器的落地实现,提供了一个灵活的"插座",其他组件只需要简单的"插上"即可享受Spring提供的基础设施支持- ,并且结合Spring一起使用。 Spring的核心在于它的IOC容器设计,我们可以通过Spring应用程序上下文生命周期和Spring Bean的生命周期…

基于SpringBoot的“游戏分享网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“游戏分享网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 网站首页界面图 用户注册界面图 …

为什么用了索引,搜索速度还是很慢

索引列选择不当 1.假设有一个包含性别信息的表&#xff0c;其中有1000条记录&#xff0c;其中男性占 99%、女性占 1%。如果在性别列上创建索引&#xff0c;由于选择性太低&#xff0c;大部分查询都会涉及到表中的绝大多数行&#xff0c;这时候数据库优化器可能会认为全表扫描比…

[SpringCloud] Feign Client 的创建 (二) (五)

文章目录 1.自动配置FeignAutoConfiguration2.生成 Feign Client2.1 从Feign Client子容器获取组件2.2 Feign Client子容器的创建2.3 构建Feign Client实例 1.自动配置FeignAutoConfiguration spring-cloud-starter-openfeign 包含了 spring-cloud-openfeign-core FeignAutoCo…

HarmonyOS实战开发-如何实现一个支持加减乘除混合运算的计算器。

介绍 本篇Codelab基于基础组件、容器组件&#xff0c;实现一个支持加减乘除混合运算的计算器。 说明&#xff1a; 由于数字都是双精度浮点数&#xff0c;在计算机中是二进制存储数据的&#xff0c;因此小数和非安全整数&#xff08;超过整数的安全范围[-Math.pow(2, 53)&#…

【详解】运算放大器工作原理及其在信号处理中的核心作用

什么是运算放大器 运算放大器&#xff08;简称“运放”&#xff09;是一种放大倍数非常高的电路单元。在实际电路中&#xff0c;它常常与反馈网络一起组成一定的功能模块。它是一种带有特殊耦合电路和反馈的放大器。输出信号可以是输入信号的加法、减法、微分和积分等数学运算…

vue3+ts项目 | axios 的测试 | 测试接口

在 App.vue 中&#xff0c;测试接口 // 测试接口import request from /utils/request;import { onMounted } from vue;onMounted(() > {request.get(/hosp/hospital/1/10).then((res) > {console.log("APP组件展示获取的数据",res);})}) 在request.ts中&…

link 样式表是否会阻塞页面内容的展示?取决于浏览器,edge 和 chrome 会,但 firefox 不会。

经过实测&#xff1a; 在 head 中 link 一个 1M 大小的样式表。设置网络下载时间大概为 10 秒。 edge 和 chrome 只有在下载完样式表后&#xff0c;页面上才会出现内容。而 firefox 可以直接先显示内容&#xff0c;然后等待样式表下载完成后再应用样式。 DOMContentLoaded 事…

Vue指令之v-for

跟其他语言中的for一样&#xff0c;是用来渲染多个类似实例的。 语法为v-for"(item, index) in 可迭代对象"&#xff0c;一般就用于遍历数组。这里的语法跟Python中的for循环enumerate也有点相似之处&#xff0c;但要注意item在前&#xff0c;index在后&#xff0c;…

探索Java学习的精华:必备资料分享

239程序员职业规划手册 238手把手带你写一个MiniTomcat 237Rust语言从入门到实战 236超级访谈:对话道哥 235LangChain实战课 234云时代的JVM原理与实战 233AI大模型系统实战 231AI绘画核心技术与实战【未完整】 Java核心技术面试精讲 从0开始学架构 推荐系统三十六式…

CommandLineRunner解释学习

目录 一、CommandLineRunner介绍 1.1 接口定义 1.2 工作原理 二、CommandLineRunner作用 三、CommandLineRunner使用方式 3.1 实现CommandLineRunner 3.2 配置Spring Boot项目 四、完整代码地址 小剧场&#xff1a;坚持不懈&#xff01; 一、CommandLineRunner介绍 Co…

anaconda配置虚拟python环境

使用conda create命令 举例&#xff1a; 创建一个名为breed的新环境&#xff0c;并在其中安装python 3.7版本的步骤&#xff1a; 创建虚拟环境 conda create --name breed python3.7激活新创建的环境&#xff1a; conda activate breed查看存在的虚拟环境 conda env list退…

复杂度3 二分查找函数

文章预览&#xff1a; 题目算法代码 题目 算法 本题要求用二分法查找顺序表的一个值&#xff0c;比较简单注意指针格式即可 代码 Position BinarySearch( List L, ElementType X ) {int begin1,mid;int endL->Last;ElementType temp;while(begin<end){mid(beginend)/2…