leetcode 解题思路记录-长期更新

2023-05-16

总结

解法:Hash、双指针、快慢指针、栈、二分法、动态规划、分治法

注意事项:Java 基础(int 范围,int 数组默认值,值传递中链表的使用)返回值 or 下标,原数据是否重复,解是否唯一,是否要求有序。

小Tips:对称、回文往往只需要计算一半,或通过奇偶性快速返回;

1. 两数之和 【Easy】

关键思路:使用 Hash 快速寻找补数,将时间复杂度从两次枚举的 O(n^2) 降至 O(n) 。

扩展:Hash 非常适用于二元互补场景。(由于题目需要返回的是下标而非值,用题15的双指针反而会降低性能,因为排序会打乱坐标,需要额外的开销来记录并最终返回下标)

7. 整数反转 【Easy】

关键思路:通过循环,将原数据从右到左进行计算即可。(容易想到转为字符串再反转,但其会造成额外的字符串处理开销)

扩展:此题其实也考察到基础知识,再次可稍做复习,如 Java 中 int 大小为[-2^31, 2^31-1],超过会变成-2^31-1。以及 Integer 的缓存区[-128,127]。

9. 回文数 【Easy】

关键思路:通过计算其反转方式实现,且计算到一半即可,最后根据位数的奇偶情况进行判断。

13. 罗马数字转整数 【Easy】

关键思路:可将 IV 这类数字看做一个整体来计算,如 switch 里写死,或者提前 String.replace() 替换掉;也可将 IV 看做减法,即每次比较当前数与后一数,大于做加法小于做减法。但时间复杂度都是 O(n) ,区别仅在语言基础层面。

14. 最长公共前缀 【Easy】

关键思路:纵向比较,注意这里两层枚举和通常的先枚举元素不同,所以可先提取第一个元素来进行比较。其他方式如分治法,将 f(X1,X2,X3) 转为 f(f(X1,X2),X3) 等。

15. 三数之和 【Medium】

关键思路:排序+双指针,巧妙将时间复杂度从三次枚举的 O(n^3) 降至 O(n^2) 。

扩展:双指针适合用枚举2个元素时,一个递增,一个递减的场景。(由于题目中数字可重复、解不唯一,用题1的 Hash 法反而会降低性能,例如通过 List.contains() 来去重)

19. 删除链表的倒数第N个结点 【Medium】

关键思路:快慢指针,快指针先移动N个结点,然后快慢指针同步移动,当快指针到达链表末尾时慢指针即到达倒数N个结点。当然,也可以先遍历一次统计链表长度,再删去正数结点即可。

20. 有效的括号 【Easy】

关键思路:,同时由于对称性当原字符串长度为奇数可直接返回 false 。其他调整包括用 ASCII 码来判断符号,或用 String.replace() 来操作,想法不错但并非最优解。

21. 合并两个有序链表 【Easy】

关键思路:定义好一个根结点,判断并指向当前两个链表表头更小的,而后更小的链表往后移动。(这里考察基础,Java 中为值传递,对象间 = 符号传递地址,即如果使用 User user2 = user1 这样的写法,后续将同时修改到两个 User 对象,除非成员变量使用 final 修饰)

26. 删除排序数组中的重复项 【Easy】(关键思路:按照题目要求维护好两个指针即可)

27. 移除元素【Easy】

关键思路:相较于题26更为复杂,但本质上依然是维护双指针,并且题目中的“常数级空间复杂度”、“不考虑顺序”也提示到这一点。

28. 实现strStr()【Easy】

关键思路:类似于题14的寻找最长公共前缀,处理好双指针,注意回溯。(还可以采用Hash法,设定一个Hash函数,计算滑动窗口的Hash值是否等于字串)

35. 搜索插入位置【Easy】(关键思路:直接枚举或采用二分法

38. 外观数列【Easy】(过于简单,跳过讲解)

53. 最大子序和【Easy】

关键思路:暴力枚举 O(n^2)、动态规划 O(n)分治法 O(n)。假设数组为 a1 a2 …… an , 连续子数组的最大和为 f(n),f(n) = Max( f(n - 1) + an , an) ,用一个数组 dp 来维护 f(1) f(2) …… f(n),最终取最大值,这样写可读性高,一目了然 DP;但可将空间复杂度进一步优化至 O(1),即用pre来表示 f(n - 1)。

58. 最后一个单词的长度【Easy】(按照题意倒叙枚举即可,主要是语言细节层面调优代码)

66. 加一【Easy】(按照题意倒叙枚举即可,注意 Java int 数组默认值都是 0,可针对此快速返回)

67. 二进制求和【Easy】(与66类似,可直接相加,或采用位运算

83. 删除排序链表中的重复元素【Easy】(按题意删除结点即可,注意链表的各类操作)

146. LRU缓存机制 【Medium】

关键思路:HashMap + 双向链表,来实现常数级别的 get set,以及LRU机制。

237. 删除链表中的结点【Easy】(直接删除当前结点即可,可归纳删当前和删下一个的区别)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode 解题思路记录-长期更新 的相关文章

  • 《LeetCode力扣练习》代码随想录——哈希表(四数之和---Java)

    LeetCode力扣练习 代码随想录 哈希表 四数之和 Java 刷题思路来源于 代码随想录 18 四数之和 排序双指针 class Solution public List
  • leetcode对称二叉树(每日一题)

    https leetcode cn problems symmetric tree description 今天我们在来个题目 对称二叉树 其实这道题的思路我觉得和那到判断两棵树是不是相同的题目很相似 写这个题目的思路还是递归 但是我们看这
  • C/C++---------------LeetCode第509. 斐波那契数

    斐波那契数列 题目及要求 暴力递归 备忘录的递归 动态规划 题目及要求 斐波那契数 通常用 F n 表示 形成的序列称为 斐波那契数列 该数列由 0 和 1 开始 后面的每一项数字都是前面两项数字的和 也就是 F 0 0 F 1 1 F n
  • 200.岛屿数量(bfs写法)

    宽搜的正常思路 只不过每次加上计算岛屿数量cnt即可 class Solution public int numIslands char grid int n grid length int m grid 0 length int dx n
  • 扬帆证券:什么是股票股利?它和现金股利之间的区别是什么?

    什么是股票股利 股票股利是公司以其所发行股票作为股利的支付办法 它将发放的分红换算为等值的股份 完结持股人股份的增加 对公司来说 选用股票股利进行无偿增发新股时 既不减少公司现金 又能给予股东利润 值得一提的是 如果公司采取现金股利的分红支
  • LeetCode21. Merge Two Sorted Lists

    文章目录 一 题目 二 题解 一 题目 You are given the heads of two sorted linked lists list1 and list2 Merge the two lists into one sort
  • 力扣面试题 16.19. 水域大小(java DFS解法)

    Problem 面试题 16 19 水域大小 文章目录 题目描述 思路 解题方法 复杂度 Code 题目描述 思路 该问题可以归纳为一类 遍历二维矩阵 的题目 此类中的一部分题目可以利用 DFS 来解决 具体到本题目 该题目可以的写法大体不
  • 《LeetCode力扣练习》代码随想录——双指针法(反转链表---Java)

    LeetCode力扣练习 代码随想录 双指针法 反转链表 Java 刷题思路来源于 代码随想录 206 反转链表 双指针 Definition for singly linked list public class ListNode int
  • LeetCode经典150题.274.H指数

    题目 274 H 指数 给你一个整数数组 citations 其中 citations i 表示研究者的第 i 篇论文被引用的次数 计算并返回该研究者的 h 指数 根据维基百科上 h 指数的定义 h 代表 高引用次数 一名科研人员的 h 指
  • Leetcode 45 跳跃游戏 II

    题意理解 给定一个长度为 n 的 0 索引 整数数组 nums 初始位置为 nums 0 每个元素 nums i 表示从索引 i 向前跳转的最大长度 还是从初始坐标i 0的位置到达最后一个元素 但是问题不是能不能跳到 而是 最少几步能跳到最
  • 【每日一题】2397. 被列覆盖的最多行数-2024.1.4

    题目 2397 被列覆盖的最多行数 给你一个下标从 0 开始 大小为 m x n 的二进制矩阵 matrix 另给你一个整数 numSelect 表示你必须从 matrix 中选择的 不同 列的数量 如果一行中所有的 1 都被你选中的列所覆
  • 【每日一题】2397. 被列覆盖的最多行数-2024.1.4

    题目 2397 被列覆盖的最多行数 给你一个下标从 0 开始 大小为 m x n 的二进制矩阵 matrix 另给你一个整数 numSelect 表示你必须从 matrix 中选择的 不同 列的数量 如果一行中所有的 1 都被你选中的列所覆
  • 二分查找(二)

    点名 点名 某班级 n 位同学的学号为 0 n 1 点名结果记录于升序数组 records 假定仅有一位同学缺席 请返回他的学号 二分法思路 判断数组的值和对应的下标是否相等 将数组分为两个区间 不相等区间的最左端 就是第缺席的同学的学号
  • 【LeetCode:114. 二叉树展开为链表 | 二叉树 + 递归】

    算法题 算法刷题专栏 面试必备算法 面试高频算法 越难的东西 越要努力坚持 因为它具有很高的价值 算法就是这样 作者简介 硕风和炜 CSDN Java领域新星创作者 保研 国家奖学金 高中学习JAVA 大学完善JAVA开发技术栈 面试刷题
  • LeetCode-数组-双指针-中等难度

    文章目录 双指针 1 删除有序数组中的重复项 入门 1 1 题目描述 1 2 解题思路 1 3 代码实现 2 删除有序数组中的重复项 II 简单
  • 扬帆证券:如何辨别股票基本面的好坏?

    怎样区别股票根本面的好坏 教你轻松区别优劣股 1 市盈率 市盈率是指一个公司股票的价格相对于其每股收益的比率 是衡量一家公司是否被高估或轻视的重要方针之一 2 市净率 市净率指的是每股股价与每股净资产的比率 一般来说市净率较低的股票 出资价
  • 扬帆证券:跨年期控股权易主活跃 多元化助推因素值得关注

    岁末年初 A股实控权改变趋向生动 2023年底 天汽模 中天精装 电工合金 三湘形象等公司相继公告控制权改变事宜 2024年以来 ST大集等公司打开实控人改变之路 宝莫股份等公司的易主在年初快速落定 这些易主运作中 部分案例超出商场预期 以
  • ​LeetCode解法汇总82. 删除排序链表中的重复元素 II

    目录链接 力扣编程题 解法汇总 分享 记录 CSDN博客 GitHub同步刷题项目 https github com September26 java algorithms 原题链接 力扣 LeetCode 描述 给定一个已排序的链表的头
  • 「优选算法刷题」:移动零

    嗨 这个假期罗根开始接触了算法 在为今年的蓝桥杯做准备 所以 开个新专栏 记录记录自己做算法题时的心得 一 题目 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 请注意 必须在不复制数组的情况下
  • 『力扣刷题本』:逆波兰表达式求值

    大家好久不昂 最近 1 个多月罗根一直在备考期末 文章发的很少 现在已经放寒假啦 学习自然也不能拉下 毕竟 4 月份就要去参加蓝桥杯了 先给自己定个小目标 日更 2 篇 咳咳 下面马上开始讲题 一 题目 给你一个字符串数组 tokens 表

随机推荐