力扣刷题之路

在算法刷题中,“思路的迭代”往往比 “写出代码” 更有价值 —— 从暴力遍历到贪心、从递归到迭代、从局部最优到全局最优,每一步优化都体现了算法思维的进阶。本文以 LeetCode 中 3 道经典题(岛屿面积、反转链表、分发糖果)为例,拆解其解题思路的 “深度” 所在。

695. 岛屿的最大面积:DFS 的 “淹没式” 遍历思维

问题本质

在二维网格中寻找连通区域的最大规模,核心是 **“标记已访问区域” 以避免重复计算 **。

初级思路:暴力遍历 + 标记

遍历每个格子,遇到 “陆地(1)” 就向上下左右扩展,同时将访问过的陆地置为 “水(0)”(相当于 “淹没”,避免重复遍历)。

// 全局变量记录当前岛屿面积和最大面积 int count = 0, ret = 0, m, n; void dfs(vector<vector<int>>& grid, int x, int y) { // 越界或非陆地,直接返回 if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) return; // 标记为已访问(淹没) grid[x][y] = 0; count++; // 当前岛屿面积+1 // 向四个方向扩展 dfs(grid, x+1, y); dfs(grid, x-1, y); dfs(grid, x, y+1); dfs(grid, x, y-1); } int maxAreaOfIsland(vector<vector<int>>& grid) { m = grid.size(), n = grid[0].size(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (grid[i][j] == 1) { count = 0; // 新岛屿重置计数 dfs(grid, i, j); ret = max(ret, count); // 更新最大面积 } } } return ret; }

深度思考:为什么用 “淹没” 而不是额外数组标记?

  • 常规 DFS 会用visited数组标记已访问区域,但本题中将陆地置为 0 的 “原地修改”更优:
    1. 节省空间(无需额外 O (mn) 的数组);
    2. 逻辑更直接(陆地被 “淹没” 后,后续遍历不会重复处理)。

206. 反转链表:递归的 “后序思维”

问题本质

将链表的 “指向关系” 反转 —— 每个节点的next指针从 “指向下一个节点” 改为 “指向前一个节点”。

初级思路:迭代法(双指针)

precur两个指针,遍历链表时不断修改cur->next的指向:

ListNode* reverseList(ListNode* head) { ListNode *pre = nullptr, *cur = head; while (cur != nullptr) { ListNode* next = cur->next; // 保存下一个节点 cur->next = pre; // 反转指向 pre = cur; // pre后移 cur = next; // cur后移 } return pre; }

进阶思路:递归法(后序遍历)

递归的核心是 **“从后往前” 处理节点 **—— 先递归到链表尾部,再反向修改next指针:

ListNode* reverseList(ListNode* head) { // 递归终止条件:空链表或只有一个节点 if (head == nullptr || head->next == nullptr) return head; // 递归到最后一个节点(新头节点) ListNode* newHead = reverseList(head->next); // 后序操作:修改当前节点的next指向 head->next->next = head; // 让下一个节点指向自己 head->next = nullptr; // 断开原指向(避免环) return newHead; }

深度思考:递归的 “后序” 价值

递归反转链表的关键是 **“后序遍历”**:

  • 递归调用是 “递” 的过程(走到链表尾部);
  • 修改next指针是 “归” 的过程(从尾部往头部反向修改指向)。这种思路避免了迭代法中 “保存下一个节点” 的操作,逻辑更简洁,但需要理解递归的 “栈帧” 执行顺序。

135. 分发糖果:贪心的 “两次遍历” 思维

问题本质

两个约束条件(每个孩子至少 1 颗、评分高的孩子比邻居多)下,求 “最少糖果数”—— 本质是局部最优→全局最优的贪心策略。

错误思路:单次遍历

如果只从左到右遍历,会忽略 “右边孩子评分比左边高” 的情况(比如[1,3,2],单次遍历会得到[1,2,1],但正确结果是[1,2,1],但如果是[1,2,3,2,1],单次遍历会错误计算)。

正确思路:两次贪心遍历

  1. 左→右遍历:保证 “右边评分高的孩子比左边多”;
  2. 右→左遍历:保证 “左边评分高的孩子比右边多”;最终取两次遍历的最大值,满足两个约束条件。
int candy(vector<int>& ratings) { int n = ratings.size(); vector<int> candies(n, 1); // 每个孩子至少1颗 // 左→右:右边比左边高,糖果+1 for (int i = 1; i < n; i++) { if (ratings[i] > ratings[i-1]) { candies[i] = candies[i-1] + 1; } } // 右→左:左边比右边高,取当前值和右边+1的最大值 for (int i = n-2; i >= 0; i--) { if (ratings[i] > ratings[i+1]) { candies[i] = max(candies[i], candies[i+1] + 1); } } // 求和 int total = 0; for (int num : candies) total += num; return total; }

深度思考:为什么需要两次遍历?

贪心算法的核心是 **“每次只满足一个约束”**:

  • 左→右遍历只能保证 “左边约束”(右边比左边高);
  • 右→左遍历才能补充 “右边约束”(左边比右边高);两次遍历后,每个孩子的糖果数同时满足两个约束,且是 “最少” 的(因为每次只在必要时增加糖果数)。

写在最后:算法思路的 “深度” 是什么?

从这 3 道题可以看出,算法的 “深度” 不是 “写出更复杂的代码”,而是:

  1. 空间优化:如岛屿问题中用 “原地修改” 代替额外数组;
  2. 思维转换:如反转链表中用 “后序递归” 代替迭代;
  3. 约束拆分:如分发糖果中用 “两次遍历” 拆分两个约束。

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

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

相关文章

【day 52】神经网络调参指南

浙大疏锦行 import torch import torch.nn as nn# 定义简单的线性模型&#xff08;无隐藏层&#xff09; # 输入2个纬度的数据&#xff0c;得到1个纬度的输出 class SimpleNet(nn.Module):def __init__(self):super(SimpleNet, self).__init__()# 线性层&#xff1a;2个输入特…

西门子 S7 - 200 SMART 与台达变频器 485 通讯实现触摸屏控制

西门子s7 200smart与台达变频器485通讯 目标&#xff1a;用触摸屏和西门子smart 控制变频器通讯 器件&#xff1a;西门子s7 200 smart PLC&#xff0c;台达VFD-M变频器&#xff0c;昆仑通态触摸屏(带以太网)&#xff0c;中途可以加路由器 控制方式&#xff1a;触摸屏与plc以太网…

Java毕设项目推荐-基于SpringBoot+vue的保护动物公益救助交流活动平台基于SpringBoot濒危物种公益救助交流平台【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

收藏级!大模型核心架构与底层原理全解析,小白程序员入门必看

当下&#xff0c;生成式大模型正以颠覆性态势席卷全球科技领域&#xff0c;一场围绕“模型主导未来”的产业竞争已全面铺开。对于深耕IT行业的从业者而言&#xff0c;这场技术浪潮绝非单纯的迭代升级&#xff0c;更在悄然重塑整个技术生态——过去依赖独立软件实现功能的传统模…

定时任务简单源码思路手撕实现

定时任务简单源码思路手撕实现 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.locks.LockSupport;public class ScheduleService {Trigger trigger …

Java swing mysql实现的酒店管理系统_javswing酒店管理系统mysql,零基础入门到精通,收藏这篇就够了

1、散客开单&#xff1a;完成散客的开单&#xff0c;可一次最多开5间相同类型的房间。 2、团体开单&#xff1a;完成团体的开单&#xff0c;开放数量没有限制&#xff0c;可同时开不同类型的房间。 3、宾客结帐&#xff1a;自动统计每个登记客人在店时所发生的消费额和应付款额…

没加 FOR UPDATE 也会加锁吗?真相来了!

视频看了几百小时还迷糊&#xff1f;关注我&#xff0c;几分钟让你秒懂&#xff01;很多开发者有个误区&#xff1a;“只有写了 SELECT ... FOR UPDATE 才会加锁&#xff0c;普通的 UPDATE 不会加锁。”这是完全错误的&#xff01;今天我们就用 Spring Boot MySQL&#xff08;…

Commons-io工具包与Hutool工具包

Commons-io Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包 作用:提高I0流的开发效率。 FileUtils类(文件/文件夹相关) static void copyFile(File srcFile,File destFile) 复制文件 static void copyDirectory(File srcDir,File destDir) 复制文件夹 stat…

TRO 基于扩散模型的轮椅共享控制用户意图估计研究

在智能轮椅的辅助导航中&#xff0c;如何在保障安全的同时尊重用户的自主意愿&#xff0c;一直是人机交互领域的核心难题。传统的意图预测方法往往试图给出唯一的“标准答案”&#xff0c;这容易在复杂环境中引发误判。本文介绍了一种名为 DIWIE&#xff08;基于扩散模型的轮椅…

MySQL性能优化:从底层原理到实战落地的全维度方案

在数据驱动的业务场景中&#xff0c;MySQL作为主流开源关系型数据库&#xff0c;其性能直接决定系统响应速度、吞吐量与运维成本。尤其对于高并发、大数据量的平台&#xff08;如DeepSeek这类AI服务场景&#xff09;&#xff0c;慢查询与不合理索引设计可能引发系统卡顿甚至雪崩…

【课程设计/毕业设计】基于SpringBoot保护濒危野生动物公益救助交流平台基于SpringBoot濒危物种公益救助交流平台【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

JVM 里的逻辑漏洞,居然让你的哈希表慢了 20%!

首先来看一段 Java 代码&#xff1a; int sumMapElements(ConcurrentHashMap<Integer, Integer> map) {int sum 0;Enumeration<Integer> it map.elements();while (it.hasMoreElements()) {sum (int) it.nextElement();}return sum; } 函数 sumMapElements 使…

构建智能Agent的三大支柱:上下文工程、会话管理与记忆系统

Google白皮书系统阐述了构建有状态LLM智能体的核心方法——上下文工程。通过上下文工程、会话管理和记忆系统三大支柱&#xff0c;文章详细介绍了如何突破LLM无状态限制&#xff0c;实现智能体的记忆、学习和个性化交互能力。通过动态组装相关信息、管理会话状态和持久化关键记…

收藏备用!AI+多领域变革全解析:大模型如何重塑产业生态

本文深度拆解“AI”在医疗、金融、制造等核心领域的颠覆性变革&#xff0c;结合大模型应用实例&#xff0c;具象化展现人工智能如何重构行业运行逻辑与生态格局。从医疗健康领域“治未病”的主动防控&#xff0c;到金融行业“数字神经系统”的智能风控&#xff0c;从制造业向“…

收藏备用|RAG技术架构三阶段演进全解析(从入门到进阶,小白也能懂)

RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;作为大语言模型&#xff08;LLM&#xff09;落地垂直领域的核心支撑技术&#xff0c;其核心价值在于为LLM“外挂”可定制化专属知识库&#xff0c;通过“检索外部信息→精准辅助生成”的闭环…

毕业论文通关秘籍:宏智树 AI 教你避开 80% 写作坑

作为深耕论文写作科普的教育博主&#xff0c;每年毕业季后台都会被各种论文难题刷屏&#xff1a;“选题太老被导师驳回怎么办&#xff1f;”“文献综述写得像流水账怎么救&#xff1f;”“查重率降不下来&#xff0c;越改越乱咋整&#xff1f;” 毕业论文写作&#xff0c;就像一…

AI 写论文哪个软件最好?实测封神!宏智树 AI 堪称毕业论文通关外挂

作为深耕论文写作科普的教育测评博主&#xff0c;后台每天都被毕业生的灵魂拷问刷屏&#xff1a;“AI 写论文工具琳琅满目&#xff0c;到底哪款能真正解决选题难、文献杂、数据空、查重高的痛点&#xff1f;” 市面上的 AI 写作软件分为三个梯队&#xff1a;文字生成器只会简单…

写论文软件哪个好?实测宏智树 AI:毕业论文的全流程效率神器

作为深耕论文写作科普的教育测评博主&#xff0c;每年毕业季后台都会被 “写论文软件哪个好” 的提问刷屏。不少同学踩坑无数&#xff1a;有的工具生成内容空洞无物&#xff0c;有的文献引用漏洞百出&#xff0c;有的查重结果与学校标准脱节。经过多轮深度实测&#xff0c;宏智…

吐血推荐9个一键生成论文工具,本科生毕业论文轻松搞定!

吐血推荐9个一键生成论文工具&#xff0c;本科生毕业论文轻松搞定&#xff01; 论文写作的救星&#xff1a;AI 工具如何改变你的学术之路 随着人工智能技术的不断进步&#xff0c;越来越多的 AI 工具开始走进高校课堂&#xff0c;为本科生的论文写作带来前所未有的便利。无论是…

西门子SMART触摸屏与两台变频器的Modbus RTU通讯实战

西门子SMART触摸屏与2台变频器通讯&#xff0c;通过modbus rtu与三菱FR-D700、台达MS300变频器通讯&#xff0c;实现正反转控制、频率设定&#xff0c;读取输出频率、输出电压、输出电流&#xff0c;有详细的程序说明和源程序文件&#xff0c;文档使用云笔记整理撰写最近在项目…