当前位置: 首页 > news >正文

力扣面试经典150 —— 6-10题

  • 力扣面试经典150题
  • 在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题,安装 Debug LeetCode 插件可以免费 debug
  • 本文使用 python 语言解题,文中 “数组” 通常指 python 列表;文中 “指针” 通常指 python 列表索引

文章目录

  • 6. [中等] 轮转数组
    • 6.1 解法1:使用额外的数组
    • 6.2 解法2:数组翻转
  • 7. [简单] 买卖股票的最佳时机
    • 7.1 解法1:暴力法
    • 7.2 解法2:贪心
  • 8. [中等] 买卖股票的最佳时机II
    • 8.1 解法1:贪心
    • 8.2 解法2:动态规划
  • 9. [中等] 跳跃游戏
    • 9.1 解法1:贪心模拟
    • 9.2 解法2:贪心
  • 10. [中等] 跳跃游戏II
    • 10.1 解法1:贪心模拟

6. [中等] 轮转数组

  • 题目链接
  • 标签:数组、数学、双指针
    在这里插入图片描述

6.1 解法1:使用额外的数组

  • 借助一个额外数据将各个元素放到新位置。注意到从整体上看,输出数组可以看作是在 k % len(nums) 位置截断然后重新组合,可以用 python 的列表操作简单地如下实现
    class Solution:def rotate(self, nums: List[int], k: int) -> None:k = k % len(nums)res = nums[-k:] + nums[:-k]nums[:] = res
    
    这其实等价于用两个指针分别遍历截断的两部分,并将元素依次复制到辅助数组
  • 时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)

6.2 解法2:数组翻转

  • 和方法一一样,注意到输出数组可以看作是在 k % len(nums) 位置截断然后重新组合,这可以通过三次列表翻转实现,示意如下
    nums = "----->-->"; k =3
    result = "-->----->";reverse "----->-->" we can get "<--<-----"
    reverse "<--" we can get "--><-----"
    reverse "<-----" we can get "-->----->"
    
    下面给出代码,使用双指针进行翻转操作
    class Solution:def rotate(self, nums: List[int], k: int) -> None:def _reverse(start, end):while start < end:t = nums[start]nums[start] = nums[end]nums[end] = tstart += 1end -= 1k = k % len(nums)_reverse(0, len(nums)-1)_reverse(0, k-1)_reverse(k, len(nums)-1)
    
  • 时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

7. [简单] 买卖股票的最佳时机

  • 题目链接
  • 标签:数组、动态规划
    在这里插入图片描述

7.1 解法1:暴力法

  • 直接遍历所有可能的买卖组合情况,但这种方法会超时
    def maxProfit(self, prices: List[int]) -> int:# 暴力法:超时profit = -float('inf')for i in range(len(prices)-1):buy = prices[i]for j in range(i+1, len(prices)):sell = prices[j]if sell > buy and sell - buy > profit:profit = sell - buyprofit = 0 if profit < 0 else profitreturn profit
    
  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),空间复杂度 O ( 1 ) O(1) O(1)

7.2 解法2:贪心

  • 只遍历一遍,在每个时刻贪心地计算可能的最大利润。为此,需要动态地更新截止目前为止的最低买入价
    class Solution:def maxProfit(self, prices: List[int]) -> int:# 贪心:动态维护历史最低价,进而利用它计算理论最大收益min_price = float('inf')max_profit = -float('inf')for p in prices:# 动态维护历史最低价if p < min_price:min_price = p# 基于历史最低价得到在当前时刻卖出的理论最大收益profit = p - min_priceif profit > max_profit:max_profit = profitmax_profit = 0 if max_profit < 0 else max_profitreturn max_profit
    
  • 时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

8. [中等] 买卖股票的最佳时机II

  • 题目链接
  • 标签:贪心、数组、动态规划
    在这里插入图片描述

8.1 解法1:贪心

  • 基于贪心的思想,实现最大利润意味着每一次可能的盈利都被把握。我们变量把股价曲线折线图,在每一个时刻执行收益最大化操作,即把每一个上升段都加入总收益中,水平或下降段则跳过
    class Solution:def maxProfit(self, prices: List[int]) -> int:max_profit = 0for i in range(len(prices)-1):profit = prices[i+1] - prices[i]if profit > 0:max_profit += profitreturn max_profit
    
  • 时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

8.2 解法2:动态规划

  • 题目设置满足动态规划的三要素
    1. 无后效性:当前和未来的交易操作不会影响过去交易操作的收益
    2. 最优子结构:在整个交易过程中实现最大收益,意味着交易过程中的任意一个时间段的收益都是最优的。问题最优解的结构包含其子问题的最优解
    3. 重叠子问题:当我们递归地自顶向下分解时,即把 “最大化前n天收益” 不断地递归分解为 “最大化前n-1天收益,同时最大化第n-1天收益” 时,出现了要在递归过程中重复求解的重叠子问题(比如 “最大化前1天收益”),这提示我们使用递推式自底向上的构造解(动态规划的自底向上形式),或使用带备忘录的递归法(动态规划的自顶向下形式)
  • 我们使用自底向上的动态规划形式,这时需要构造递推公式(动态规划中称 “状态转移方程”)。定义状态 dp[i][0]dp[i][1] 分别表示第 i i i 天交易完后手里没有和持有股票的最大利润。
    1. 对于 dp[i][0] 来说,第 i i i 天交易完后手里没有股票,意味着要么前一天就没有,要么今天卖了,递推式为
      d p [ i ] [ 0 ] = max ⁡ { d p [ i − 1 ] [ 0 ] , d p [ i − 1 ] [ 1 ] + p r i c e s [ i ] } dp[i][0]=\max\{dp[i−1][0],dp[i−1][1]+prices[i]\} dp[i][0]=max{dp[i1][0],dp[i1][1]+prices[i]}
    2. 对于 dp[i][1] 来说,第 i i i 天交易完后手里有股票,意味着要么前一天有,要么今天刚买,递推式为
      d p [ i ] [ 1 ] = max ⁡ { d p [ i − 1 ] [ 1 ] , d p [ i − 1 ] [ 0 ] − p r i c e s [ i ] } dp[i][1]=\max\{dp[i−1][1],dp[i−1][0]−prices[i]\} dp[i][1]=max{dp[i1][1],dp[i1][0]prices[i]}
    3. 根据问题定义,第0天交易时有
      d p [ 0 ] [ 0 ] = 0 , d p [ 0 ] [ 1 ] = − p r i c e s [ 0 ] dp[0][0]=0,\quad dp[0][1]=−prices[0] dp[0][0]=0,dp[0][1]=prices[0]
    4. 由于全部交易结束后,持有股票的收益一定低于不持有股票的收益,最后返回 d p [ n − 1 ] [ 0 ] dp[n−1][0] dp[n1][0] 即可
  • 注意到以上状态转移方程1、2中,dp[i] 仅与 dp[i-1] 有关,而与更早的状态都无关,因此不必存储这些无关的状态,只需要将 dp[i−1][0]dp[i−1][1] 存放在两个变量中,通过它们计算出 dp[i][0]dp[i][1] 并存回对应的变量,以便于第 i + 1 i+1 i+1 天的状态转移计算即可
    class Solution:def maxProfit(self, prices: List[int]) -> int:dp0 = 0             # 今日交易完后手里没有股票的最大利润dp1 = -prices[0]    # 今日交易完后手里有一支股票的最大利润for i in range(1, len(prices)):dp0_ = max(dp0, dp1 + prices[i])dp1_ = max(dp1, dp0 - prices[i])dp0, dp1 = dp0_, dp1_            return dp0
    
  • 时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

9. [中等] 跳跃游戏

  • 题目链接
  • 标签:贪心、数组、动态规划
    在这里插入图片描述

9.1 解法1:贪心模拟

  • 直接模拟整个转移过程,每次都贪心地跳到能去向的最远处,直到达到终点或无法前进
    class Solution:def canJump(self, nums: List[int]) -> bool:cur_pos = next_pos = 0max_range = nums[cur_pos]   # 当前可达的最大索引位置while True:# 若从当前位置可以直接到目标,退出if max_range >= len(nums) - 1:return True# 考察从当前位置可达的每个新位置可覆盖的最大范围, 贪心地选择可达范围最大处作为转移到的索引位置 next_posfor steps in range(1, nums[cur_pos] + 1):next_range = cur_pos + steps + nums[cur_pos + steps]if next_range > max_range:next_pos = cur_pos + stepsmax_range = next_range# 如果当前位置已经是最佳的,且已知当前 max_range 无法到达目标,退出if next_pos == cur_pos:return False# 去向新索引位置cur_pos = next_pos
    
  • 时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

9.2 解法2:贪心

  • 对于每一个可达位置 x x x,它使得 x + 1 , x + 2 , ⋯ , x + nums [ x ] x+1,x+2,⋯ ,x+\text{nums}[x] x+1,x+2,,x+nums[x] 这些连续的位置都可以到达。利用贪心的思想,我们遍历数组,并在每一步维护当前可达的最大状态,如果发现最后的位置可达则返回 true,反之若遍历结束后最后位置仍不可达则返回 false
    class Solution:def canJump(self, nums: List[int]) -> bool:max_range = 0for i, step in enumerate(nums):if i <= max_range:if i + step > max_range:max_range = i + stepif max_range >= len(nums) - 1:return Truereturn False
    
  • 时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

10. [中等] 跳跃游戏II

  • 题目链接
  • 标签:贪心、数组、动态规划
    在这里插入图片描述

10.1 解法1:贪心模拟

  • 和 9.1 完全一直,直接模拟整个转移过程,每次都贪心地跳到能去向的最远处,直到达到终点或无法前进。模拟的同时记录总跳跃次数并返回
    class Solution:def jump(self, nums: List[int]) -> int:# 特殊情况直接退出if len(nums) == 1:return 0cur_pos = next_pos = step_cnt = 0max_range = nums[cur_pos]while True:# 若从当前位置可以直接到目标,退出if max_range >= len(nums) - 1:return step_cnt + 1# 考察每一个新位置可以覆盖的最大范围,next_pos 设置为范围最大新索引位置for steps in range(1, nums[cur_pos] + 1):next_range = cur_pos + steps + nums[cur_pos + steps]if next_range > max_range:next_pos = cur_pos + stepsmax_range = next_range# 去向新索引位置cur_pos = next_posstep_cnt += 1
    
  • 时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

相关文章:

力扣面试经典150 —— 6-10题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 6. [中等] 轮转…...

[密码学]入门篇——加密方式

一、概述 加密方法主要分为两大类&#xff1a; 单钥加密&#xff08;private key cryptography&#xff09;&#xff1a;加密和解密过程都用同一套密码双钥加密&#xff08;public key cryptography&#xff09;&#xff1a;加密和解密过程用的是两套密码 历史上&#xff0c…...

构建前后端分离项目常用的代码

构建前后端分离项目常用的代码 1.代码生成器 import com.baomidou.mybatisplus.generator.FastAutoGenerator;import com.baomidou.mybatisplus.generator.config.OutputFile;import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;​import java.util.…...

2575. 找出字符串的可整除数组(Go语言)

https://leetcode.cn/problems/find-the-divisibility-array-of-a-string/ 在看题解之前&#xff0c;我的代码是以下这样&#xff1a; package mainimport ("fmt" )func main() {fmt.Println(divisibilityArray("998244353", 3)) }func divisibilityArray…...

Redis与 Memcache区别

Redis与 Memcache区别 1 , Redis 和 Memcache 都是将数据存放在内存中&#xff0c;都是内存数据库。不过 Memcache 还可用于缓存 其他东西&#xff0c;例如图片、视频等等。 2 , Memcache 仅支持key-value结构的数据类型&#xff0c;Redis不仅仅支持简单的key-value类型的数据&…...

#QT(智能家居界面-界面切换)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 &#xff08;1&#xff09;创建一个新界面&#xff08;UI界面&#xff09; &#xff08;2&#xff09;可以看到新加入一个ui文件&#xff0c;双击打开&#xff0c;设置窗口大小与登录界面一致 &#xff08;3&#xff09;加入几个PUS…...

js拓展-内置对象

目录 1. 数组对象 1.1 数组的四种方式 1.2 JS中数组的特点 1.3 常用方法 2. 日期对象 2.1 日期对象的创建 2.2 日期对象的方法 2.3 案例&#xff1a;输出现在的时间 3. 全局对象 3.1 字符串转换成数字类型 3.2 编码解码函数 1. 数组对象 注&#xff1a;数组在JS中是一…...

【李沐精读系列】GPT、GPT-2和GPT-3论文精读

论文&#xff1a; GPT&#xff1a;Improving Language Understanding by Generative Pre-Training GTP-2&#xff1a;Language Models are Unsupervised Multitask Learners GPT-3&#xff1a;Language Models are Few-Shot Learners 参考&#xff1a;GPT、GPT-2、GPT-3论文精读…...

Libevent的使用及reactor模型

Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库&#xff0c;主要有以下几个亮点&#xff1a;事件驱动&#xff08; event-driven&#xff09;&#xff0c;高性能;轻量级&#xff0c;专注于网络&#xff0c;不如 ACE 那么臃肿庞大&#xff1b;源代码相当精炼、易读…...

查看Linux服务器配置

# chkconfig --list # 列出所有系统服务 # chkconfig --list | grep on # 列出所有启动的系统服务 # ifconfig # 查看所有网络接口的属性 # iptables -L # 查看防火墙设置 # route -n # 查看路由表 # netstat -lntp # 查看所有监听端口 # netstat -antp # 查看所有已经建立的连…...

【机器学习】包裹式特征选择之递归特征添加法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…...

解决cs不能生成Linux木马的问题

要解决的问题&#xff1a;众所周知&#xff0c;msf上面的shell或者是其他的shell想反弹给cs默认情况下是只支持windows的&#xff0c;因为cs的监听模块默认没有linux的&#xff0c;但是有些主机就是用linux搭建的&#xff0c;这可怎么办呢。就要用到一个插件CrossC2。 下载插件…...

vue3组件通信方式

不管是vue2还是vue3,组件通信方式很重要,不管是项目还是面试都是经常用到的知识点。 vue2组件通信方式 props:可以实现父子组件、子父组件、甚至兄弟组件通信 自定义事件:可以实现子父组件通信 全局事件总线$bus:可以实现任意组件通信 pubsub:发布订阅模式实现任意组件通信…...

前端实现生成图片并批量下载,下载成果物是zip包

简介 项目上有个需求&#xff0c;需要根据表单填写一些信息&#xff0c;来生成定制的二维码图片&#xff0c;并且支持批量下载二维码图片。 之前的实现方式是直接后端生成二维码图片&#xff0c;点击下载时后端直接返回一个zip包即可。但是项目经理说后端实现方式每次改个东西…...

android 快速实现 圆角矩形控件 及 圆形控件

1.自定义RoundImageView package com.examle.widget;import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import an…...

【Python】外网远程登录访问jupyter notebook+pycharm使用ipython

第一步&#xff1a;创建python虚拟环境 conda create -n py3610 python3.6.10第二步&#xff1a;安装ipython pip install ipython pip install ipython notebook第三步&#xff1a;创建 IPython Notebook 服务器配置文件 # 进入python交互shell&#xff0c;设置密码 >&…...

error:0308010C:digital envelope routines::unsupported

error:0308010C:digital envelope routines::unsupported 报错原因解决方案方案一&#xff1a;降低node版本在17以下指定node版本 mac node版本降级 mac切换node版本 方案二&#xff1a;启用legacy OpenSSL provider方案三&#xff1a;配置package.json文件拓展&#xff1a;pac…...

Vue前端的工作需求

加油&#xff0c;新时代打工人&#xff01; 需求&#xff1a; 实现带树形结构的表格&#xff0c;父数据显示新增下级&#xff0c;和父子都显示编辑。 技术&#xff1a; Vue3 Element Plus <template><div><el-table:data"tableData"style"width…...

97. 常用的HTTP服务压测工具

文章目录 导言一、ab二、wrk三、go-wrk 导言 在项目正式上线之前&#xff0c;我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug&#xff0c;同时了解了程序的实际处理能力能够帮我们更好的匹配项目的实际需求(服务器实例个数&#xff0c;如需要部署…...

活动预告|听云猿生数据创始人 CEO 曹伟分享云数据库行业十余年经验总结

3月16日&#xff0c;KubeBlocks 将携手 OceanBase 开源社区、AutoMQ 带来《LLMs 时代下的企业数据管理与降本增效之路》主题 meetup&#xff0c;扫描下方二维码&#xff0c;即刻报名&#x1f447;。 云猿生数据创始人 & CEO 曹伟将带来《KubeBlocks&#xff1a;把所有数据…...

数仓实战——京东数据指标体系的构建与实践

目录 一、如何理解指标体系 1.1 指标和指标体系的基本含义 1.2 指标和和标签的区别 1.3 指标体系在数据链路中的位置和作用 1.4 流量指标体系 1.5 指标体系如何向上支撑业务应用 1.6 指标体系背后的数据加工逻辑 二、如何搭建和应用指标体系 2.1 指标体系建设方法—OS…...

Alias许可配置

在数字化时代&#xff0c;软件已成为企业竞争的核心要素。然而&#xff0c;随着软件市场的日益复杂&#xff0c;如何合理配置和使用软件许可&#xff0c;已成为企业亟待解决的问题。Alias许可配置服务&#xff0c;凭借其卓越的功能和性能&#xff0c;帮助企业优化软件使用&…...

【读书笔记】针对ICS的ATTCK矩阵详解(一)

Techniques - ICS | MITRE ATT&CKhttps://attack.mitre.org/techniques/ics/ 一、初始访问&#xff08;Initial Access&#xff09; 该阶段&#xff1a;攻击者正在尝试进入ICS环境。 初始访问包括攻击者可能用作入口向量&#xff0c;从而可以在 ICS 环境中获得初始立足点的…...

Rust多线程访问数据,推荐使用mutex还是channel?

在Rust中&#xff0c;选择使用互斥锁&#xff08;mutex&#xff09;还是通道&#xff08;channel&#xff09;来进行多线程间的数据访问&#xff0c;主要取决于你的具体需求和数据共享的模式。 互斥锁&#xff08;Mutex&#xff09; 互斥锁是一种同步原语&#xff0c;用于保护…...

基于pytorch的手写体识别

一、环境搭建 链接: python与深度学习——基础环境搭建 二、数据集准备 本次实验用的是MINIST数据集&#xff0c;利用MINIST数据集进行卷积神经网络的学习&#xff0c;就类似于学习单片机的点灯实验&#xff0c;学习一门机器语言输出hello world。MINIST数据集&#xff0c;可以…...

Leetcode 56. 合并区间

题目描述&#xff1a;以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xf…...

C++:List的使用和模拟实现

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 一、List的介绍 list的文档介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不…...

20个Python函数程序实例

前面介绍的函数太简单了&#xff1a; 以下是 20 个不同的 Python 函数实例 下面深入一点点&#xff1a; 以下是20个稍微深入一点的&#xff0c;使用Python语言定义并调用函数的示例程序&#xff1a; 20个函数实例 简单函数调用 def greet():print("Hello!")greet…...

Wireshark——获取捕获流量的前N个数据包

1、问题 使用Wireshark捕获了大量的消息&#xff0c;但是只想要前面一部分。 2、方法 使用Wireshark捕获了近18w条消息&#xff0c;但只需要前5w条。 选择文件&#xff0c;导出特定分组。 输入需要保存的消息范围。如&#xff1a;1-50000。 保存即可。...

006-浏览器输入域名到返回

浏览器输入域名到返回 1、URL 输入2、DNS 域名解析3、建立 TCP 连接三次握手概念三次握手理解 4、发送 HTTP/HTTPS 请求5、服务器处理&#xff0c;并返回响应6、浏览器解析并渲染页面7、请求结束&#xff0c;端口 TCP 连接四次挥手概念四次挥手理解 1、URL 输入 2、DNS 域名解析…...