尝试几道算法题,提升python编程思维

一、跳跃游戏

题目描述
给定一个非负整数数组 nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。

示例

  • 输入:nums = [2,3,1,1,4] → 输出:True
  • 输入:nums = [3,2,1,0,4] → 输出:False

---------------------------------------------------------------------------------------------------------------------------------

代码实现

def can_jump(nums):max_reach = 0n = len(nums)for i in range(n):if i > max_reach:  # 当前位置无法到达,直接失败return Falsemax_reach = max(max_reach, i + nums[i])if max_reach >= n - 1:  # 已覆盖终点,提前成功return Truereturn max_reach >= n - 1  # 遍历结束后判断

详细解析

  1. 核心变量max_reach 记录当前能到达的最远索引,初始为 0(起点)。
  2. 遍历逻辑
    • 若当前索引 i 超过 max_reach,说明该位置不可达,直接返回 False(因为无法从前面的位置跳到这里)。
    • 计算从当前位置 i 能跳到的最远距离 i + nums[i],并更新 max_reach 为两者中的较大值(确保始终记录最远可达位置)。
    • 若 max_reach 已覆盖数组最后一个索引(n-1),说明可到达终点,提前返回 True 以优化效率。
  3. 边界处理:若遍历完所有位置后 max_reach 仍未覆盖终点,则返回 False(题目中大部分情况可提前判断,此处为兜底)。
  4. 贪心思想体现:无需记录具体路径,只需通过局部最优(每次更新最远可达距离)推导全局最优(是否能到终点),时间复杂度 O (n),空间复杂度 O (1)。

二、最长递增子序列(动态规划解法)

题目描述
给你一个整数数组 nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)元素而不改变其余元素的顺序,且子序列严格递增。

示例
输入:nums = [10,9,2,5,3,7,101,18] → 输出:4(最长子序列为 [2,3,7,101] 或 [2,5,7,18]

---------------------------------------------------------------------------------------------------------------------------------

代码实现

def length_of_lis(nums):if not nums:return 0n = len(nums)dp = [1] * n  # 每个元素至少自身是一个子序列for i in range(1, n):for j in range(i):if nums[j] < nums[i]:dp[i] = max(dp[i], dp[j] + 1)return max(dp)

详细解析

  1. 动态规划数组定义dp[i] 表示以 nums[i] 为结尾的最长严格递增子序列的长度。初始值均为 1(每个元素自身构成长度为 1 的子序列)。
  2. 状态转移逻辑
    • 对于每个 i(从 1 到 n-1),遍历所有 j < i
      • 若 nums[j] < nums[i],说明 nums[i] 可接在 nums[j] 后面形成更长的子序列,因此 dp[i] 可更新为 dp[j] + 1(与当前 dp[i] 取最大值,确保记录最长长度)。
  3. 结果计算:遍历完所有 i 后,dp 数组中的最大值即为整个数组的最长递增子序列长度。
  4. 示例验证:以 nums = [2,5,3,7] 为例:
    • i=0dp[0] = 1(初始值)。
    • i=1(nums[1]=5):j=0 时 nums[0]=2 < 5,故 dp[1] = dp[0]+1 = 2
    • i=2(nums[2]=3):j=0 时 nums[0]=2 < 3,故 dp[2] = dp[0]+1 = 2j=1 时 nums[1]=5 > 3,不更新)。
    • i=3(nums[3]=7):j=0 时 dp[0]+1=2j=1 时 dp[1]+1=3j=2 时 dp[2]+1=3,故 dp[3] = 3
      最终 max(dp) = 3(对应子序列 [2,5,7] 或 [2,3,7])。
  5. 复杂度:时间复杂度 O (n²)(两层循环),空间复杂度 O (n)(存储 dp 数组)。

三、最长递增子序列(贪心 + 二分查找解法)

题目描述
同第二题(题目一致,解法不同)。

---------------------------------------------------------------------------------------------------------------------------------

代码实现

import bisectdef length_of_lis(nums):tails = []for num in nums:# 找到tails中第一个 >= num的位置,替换它idx = bisect.bisect_left(tails, num)if idx == len(tails):tails.append(num)else:tails[idx] = numreturn len(tails)

详细解析

  1. 核心思路:维护一个 tails 数组,其中 tails[i] 表示长度为 i+1 的严格递增子序列的最小尾元素。例如:
    • tails[0] 是长度为 1 的子序列的最小尾元素(即数组中最小的元素)。
    • tails[1] 是长度为 2 的子序列的最小尾元素(即能接在 tails[0] 后面的最小元素)。
      这样做的目的是:尾元素越小,后续越容易添加更大的元素形成更长的子序列(贪心策略)。
  2. 二分查找的作用
    • 对于每个新元素 num,用 bisect_left 在 tails 中查找第一个大于等于 num 的位置 idxtails 始终是严格递增的,因此可二分)。
    • 若 idx 等于 tails 的长度,说明 num 比所有现有尾元素都大,可直接追加到 tails 末尾(此时子序列长度 + 1)。
    • 否则,将 tails[idx] 替换为 num(目的是用更小的尾元素更新该长度的子序列,为后续元素留更多可能)。
  3. 示例验证
    输入 nums = [10,9,2,5,3,7,101,18]
    • num=10 → tails 为空,idx=0 等于长度 0,追加 → tails = [10]
    • num=9 → 二分找到 tails 中第一个 ≥9 的位置是 0(tails[0]=10),替换 → tails = [9]
    • num=2 → 二分找到位置 0,替换 → tails = [2]
    • num=5 → 二分找到位置 1(超过 tails 长度 1),追加 → tails = [2,5]
    • num=3 → 二分找到 tails 中第一个 ≥3 的位置是 1(tails[1]=5),替换 → tails = [2,3]
    • num=7 → 二分找到位置 2(超过长度 2),追加 → tails = [2,3,7]
    • num=101 → 二分找到位置 3(超过长度 3),追加 → tails = [2,3,7,101]
    • num=18 → 二分找到位置 3(tails[3]=101 ≥18),替换 → tails = [2,3,7,18]
      最终 tails 长度为 4,即最长子序列长度为 4(与题目示例一致)。
  4. 关键说明tails 数组本身不是最长子序列,但其长度等于最长子序列的长度(因为每次更新都对应子序列长度的潜在增长)。
  5. 复杂度:时间复杂度 O (n log n)(每个元素二分查找 O (log k),k 是当前 tails 长度,总复杂度 O (n log n)),空间复杂度 O (n)(tails 最长为 n)。

四、岛屿数量(DFS 解法)

题目描述
给你一个由 '1'(陆地)和 '0'(水)组成的二维网格,请你计算网格中岛屿的数量。岛屿由相邻的陆地连接形成,相邻指水平或垂直方向(斜向不算)

示例
输入:

grid = [["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]
]

输出:3

-------------------------------------------------------------------------------------

答案

def num_islands(grid):if not grid:return 0rows, cols = len(grid), len(grid[0])count = 0def dfs(i, j):# 越界或不是陆地,直接返回if i < 0 or i >= rows or j < 0 or j >= cols or grid[i][j] != '1':returngrid[i][j] = '0'  # 标记为已访问(淹没)# 递归遍历四个方向(上下左右)dfs(i+1, j)  # 下dfs(i-1, j)  # 上dfs(i, j+1)  # 右dfs(i, j-1)  # 左for i in range(rows):for j in range(cols):if grid[i][j] == '1':count += 1  # 发现新岛屿dfs(i, j)  # 淹没整个岛屿,避免重复计数return count

详细解析

  1. 核心问题:统计 “连通分量” 的数量(相邻陆地构成的独立区域)。
  2. DFS 函数作用:从坐标 (i,j) 出发,递归 “淹没” 所有相连的陆地(将 '1' 改为 '0'),确保每个岛屿只被计数一次。
  3. DFS 终止条件
    • 坐标越界(i 或 j 超出网格范围)。
    • 当前位置不是陆地(grid[i][j] != '1',可能是水或已被淹没的陆地)。
  4. 主循环逻辑
    • 遍历网格中的每个单元格 (i,j)
    • 若遇到 grid[i][j] == '1',说明发现一个新岛屿,计数器 count 加 1。
    • 立即调用 dfs(i,j) 淹没该岛屿(将所有相连的 '1' 改为 '0'),防止后续遍历再次计数。
  5. 示例验证
    以上述示例为例:
    • 首次遇到 (0,0) 为 '1'count=1,启动 DFS 淹没左上角所有相连的 '1'(第一、二行前两列变为 '0')。
    • 继续遍历,遇到 (2,2) 为 '1'count=2,启动 DFS 淹没中间岛屿。
    • 最后遇到 (3,3) 为 '1'count=3,启动 DFS 淹没右下角岛屿((3,3) 和 (3,4) 相连)。
      最终 count=3,与示例一致。
  6. 复杂度:时间复杂度 O (rows×cols)(每个单元格最多被访问一次),空间复杂度 O (rows×cols)(最坏情况全是陆地,递归栈深度为网格大小)。

 

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

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

相关文章

【菜狗处理脏数据】对很多个不同时间序列数据的文件聚类—20250722

目录 具体做法 可视化方法1&#xff1a;PCA降维 可视化方法2、TSNE降维可视化&#xff08;非线性降维&#xff0c;更适合聚类&#xff09; 可视化方法3、轮廓系数评判好坏 每个文件有很多行列的信息&#xff0c;每列是一个驾驶相关的数据&#xff0c;需要对这些文件进行聚类…

Qwen-MT:翻得快,译得巧

我们再向大家介绍一位新朋友&#xff1a;机器翻译模型Qwen-MT。开发者朋友们可通过Qwen API&#xff08;qwen-mt-turbo&#xff09;&#xff0c;来直接体验它又快又准的翻译技能。 本次更新基于强大的 Qwen3 模型&#xff0c;进一步使用超大规模多语言和翻译数据对模型进行训练…

在 OceanBase 中,使用 TO_CHAR 函数 直接转换日期格式,简洁高效的解决方案

SQL语句SELECT TO_CHAR(TO_DATE(your_column, DD-MON-YY), YYYY-MM-DD) AS formatted_date FROM your_table;关键说明&#xff1a;核心函数&#xff1a;TO_DATE(30-三月-15, DD-MON-YY) → 将字符串转为日期类型TO_CHAR(..., YYYY-MM-DD) → 格式化为 2015-03-30处理中文月份&a…

pnpm运行electronic项目报错,npm运行正常。electronic项目打包为exe报错

pnpm运行electronic项目报错 使用 pnpm 运行 electronic 项目报错&#xff0c;npm 运行正常&#xff0c;报错内容如下 error during start dev server and electron app: Error: Electron uninstallat getElectronPath (file:///E:/project/xxx-vue/node_modules/.pnpm/elect…

8️⃣ 高级特性—— 列表生成式

文章目录&#x1f9e0; 总结1. 基本语法2. 加筛选条件&#x1f501; 双层循环&#xff08;全排列&#xff09;&#x1f4c2; 遍历目录&#x1f511; 遍历字典&#x1f521; 转小写3. if 和 if...else 的区别4. 练习题&#x1f9e0; 总结 特性用法示例基础语法[x for x in iter…

DocC的简单使用

DocC的简单使用 在写3GShare中&#xff0c;由于刚开始使用MVC模式来写东西&#xff0c;对很多东西都不是很熟&#xff0c;经常写着写着就忘了自己在写什么&#xff0c;所以学了一下DocC来加快开发进度 什么是DocC 简单来说&#xff0c;DocC就是更高级的注释&#xff0c;虽然…

深入理解C语言快速排序与自省排序(Introsort)

排序算法是计算机科学中最基础也是最重要的知识之一。快速排序&#xff08;Quicksort&#xff09;因其平均时间复杂度为 O(n log n) 而广受欢迎&#xff0c;但在最坏情况下会退化到 O(n)。为了克服这一缺点&#xff0c;自省排序&#xff08;Introsort&#xff09; 应运而生&…

C#编程基础:运算符与结构详解

目录 一.关系运算符 常见关系运算符 二.逻辑运算符 常见逻辑运算符 1. 逻辑与&#xff08;&& 或 and&#xff09; 2. 逻辑或&#xff08;|| 或 or&#xff09; 3. 逻辑非&#xff08;! 或 not&#xff09; 运算符优先级 三.if语句 1.c#程序的三大结构 1.顺序…

嵌入式学习-土堆目标检测(3)-day27

再学一个labelme在labelstudio环境中再pip install labelme安装好后直接输入 labelme之后点击保存&#xff0c;选择保存文件地址还有一个就是将labelme的格式转化为yolo格式还是在labelstudio这个环境里面安装pip install labelme2yolo

Qt OpenGL 集成:开发 3D 图形应用

Qt 提供了完善的 OpenGL 集成方案&#xff0c;使开发者能够在 Qt 应用中高效开发 3D 图形应用。通过 Qt 的 OpenGL 模块&#xff0c;可简化 OpenGL 上下文管理、窗口渲染和跨平台适配&#xff0c;同时结合现代 OpenGL 特性&#xff08;如着色器、顶点缓冲、纹理等&#xff09;实…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 热词评论查询功能实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解热词评论查询功能实现 视频在线地址&#…

使用 Google Earth 的 DEM — 教程。

数字高程模型 (DEM)描绘了已知高程点之间的表面高程。本教程将向您展示如何使用 Google Earth 的高程数据生成 DEM。在当今世界&#xff0c;DEM 主要用于 GIS 应用。 当然&#xff0c;我们可以从美国地质调查局 (USGS) 网站下载数字高程模型 (DEM)。但如果我们想知道某个地点的…

在 UniApp 中实现中间凸起 TabBar 的完整指南

如何在 UniApp 中设置中间 TabBar 凸起效果 在移动应用开发中&#xff0c;TabBar 是常见的导航组件&#xff0c;而中间凸起的 TabBar 按钮则是一种流行的设计风格&#xff0c;常用于突出重要功能&#xff08;如发布、拍照等&#xff09;。UniApp 提供了 midButton 属性&#xf…

微观低代码

今日去深圳的一家工厂给客户做培训&#xff0c;主要培训内容为低代码产品的二开和功能演示。客户使用了20年的ERP和OA系统&#xff0c;目前想对接到低代码平台。客户目前想实现的主要功能是&#xff0c;对接OA的单点登录&#xff0c;把ERP的功能迁移到低代码平台上来工厂规模比…

Linux进程控制:掌握系统的核心脉络

Linux进程控制&#xff1a;掌握系统的核心脉络 在 Linux 系统中&#xff0c;进程控制是系统运行的核心机制之一。无论是日常的命令行操作&#xff0c;还是复杂的后台服务运行&#xff0c;都离不开对进程的管理和控制。本文将深入探讨 Linux 进程控制的相关知识&#xff0c;帮助…

4N90-ASEMI电机控制专用4N90

编辑&#xff1a;LL4N90-ASEMI电机控制专用4N90型号&#xff1a;4N90品牌&#xff1a;ASEMI封装&#xff1a;ITO-220ABRDS(on):3.60Ω批号&#xff1a;最新引脚数量&#xff1a;3封装尺寸&#xff1a;如图特性&#xff1a;N沟道MOS管工作结温&#xff1a;-55℃~150℃一、卓越性…

Java 笔记 lambda

✅Lambda 基本语法 (parameters) -> expression 或 (parameters) -> { statements }// 无参数 Runnable r () -> System.out.println("Hello");// 单个参数&#xff08;小括号可省略&#xff09; Consumer<String> c s -> System.out.println(s…

安全风险监测平台:被动应对向主动预防的转变

一、智能识别预警系统安全风险监测平台通过部署多维度感知网络&#xff0c;实现对各类安全隐患的智能识别与实时预警。系统采用深度学习算法&#xff0c;对人员行为、设备状态、环境参数等进行全天候监测分析&#xff0c;建立动态风险评估模型。当检测到异常情况时&#xff0c;…

图片查重从设计到实现(2)Milvus安装准备etcd介绍、应用场景及Docker安装配置

etcd作用、应用场景及Docker安装配置 在分布式向量数据库 Milvus 的架构中&#xff0c;etcd 扮演着至关重要的角色。Milvus 用于存储和管理海量向量数据&#xff0c;支持高效的相似性搜索等操作&#xff0c;而其分布式集群的正常运行高度依赖元数据的一致性和可靠性&#xff0c…

零弹窗干扰的贪吃蛇游戏,下载即玩

软件介绍 在寻找贪吃蛇游戏的过程中&#xff0c;我发现了一款PC端版本&#xff0c;无需登录即可直接使用&#xff0c;完全符合我的需求。 使用优势 这款软件最大的亮点在于完全免费&#xff0c;没有任何广告和弹窗干扰&#xff0c;支持完全离线运行&#xff0c;让用户能够专注…