![](https://img-blog.csdnimg.cn/2019092715111047.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode
文章平均质量分 75
刷题进阶训练
chaser&upper
西电CS硕士在读,热爱Coding,喜欢分享,欢迎您与我交流~
展开
-
LeetCode 59. 螺旋矩阵 II
可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是一进循环深似海,从此offer是路人。:将二维数组作为标记,同时作为边界值,遇到非0即代表已填充,则终止该方向的迭代,后退一步,循环下个方向。由外向内一圈一圈这么画下去。原创 2024-05-30 21:27:04 · 302 阅读 · 0 评论 -
剑指 Offer 56 - I. 数组中数字出现的次数
剑指 Offer 56 - I. 数组中数字出现的次数题目描述思路描述分组异或JavaC++Python题目描述一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]思路描述分组异或让我们先来考虑一个比较简单的问题:如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?答案很简单:全员进行异或操作即可。考原创 2022-01-19 22:06:23 · 236 阅读 · 0 评论 -
LeetCode 剑指 Offer 24. 反转链表
LeetCode 剑指 Offer 24. 反转链表题目描述迭代JavaCpp递归JavaCpp理解题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL迭代假设链表为1->2->3->null,我们想要把它反转为null->3->2->1。在遍历链表时,将当前节点的ne原创 2022-01-16 22:06:30 · 600 阅读 · 0 评论 -
LeetCode 122. 买卖股票的最优时机 II
LeetCode 122. 买卖股票的最佳时机 II题目描述思路描述动态规划贪心题目描述给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例:输入: prices = [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖原创 2021-12-04 21:49:51 · 545 阅读 · 0 评论 -
LeetCode 26. 删除有序数组中的重复项
删除排序数组中的重复项题目描述思路描述JavaPython题目描述给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。输入:nums = [1,1,2]输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。思路描述因为数组是排原创 2021-12-03 13:13:19 · 633 阅读 · 0 评论 -
LeetCode 99. 恢复二叉搜索树
恢复二叉搜索树题目描述显式中序遍历隐式中序遍历题目描述给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?输入:root = [1,3,null,null,2]输出:[3,1,null,null,2]解释:3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。输入:root = [3,1,4,null,null,原创 2021-11-24 13:06:33 · 224 阅读 · 0 评论 -
LeetCode 98. 验证二叉搜索树
LeetCode 98. 验证二叉搜索树题目描述方法一: 递归JavaC++方法二:中序遍历JavaC++题目描述给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例:输入:root = [2,1,3]输出:true输入:root = [5,1,4,null,null,3,6]输出:false解释:根节原创 2021-11-05 12:59:15 · 226 阅读 · 0 评论 -
LeetCode 125. 验证回文串
LeetCode 125. 验证回文串题目描述方法一:筛选 + 判断C++JavaPython方法二:双指针题目描述给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例:输入: “A man, a plan, a canal: Panama” 输出: true解释:“amanaplanacanalpanama” 是回文串方法一:筛选 + 判断最简单的方法是对字符串 s 进行一次遍历,并将其中的字母和数字字符进原创 2021-10-12 21:36:28 · 216 阅读 · 0 评论 -
剑指 Offer II 052. 展平二叉搜索树
展平二叉搜索树题目描述解题思路代码题目描述给你一棵二叉搜索树,请 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。示例:输入:root = [5,3,6,2,4,null,8,1,null,null,null,7,9]输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]解题思路展平二叉搜索树,也就是对二叉搜索树进行中序遍历,然后将各个节点的指原创 2021-09-27 16:53:23 · 402 阅读 · 0 评论 -
LeetCode 94. 二叉树的中序遍历
二叉树的中序遍历题目描述方法一:递归方法二:迭代方法三:Morris 中序遍历题目描述给定一个二叉树的根节点 root ,返回它的 中序 遍历。输入:root = [1,null,2,3]输出:[1,3,2]方法一:递归首先我们需要了解什么是二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。class Solution {原创 2021-09-18 10:18:32 · 338 阅读 · 0 评论 -
LeetCode 28. 实现 strStr() 字符串匹配(BP&KMP)
LeetCode 28. 实现 strStr 字符串匹配(BP&KMP)题目描述方法一:暴力匹配方法二:Knuth-Morris-Pratt 算法题目描述实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而言,当 needle 是空字原创 2021-08-23 09:51:20 · 458 阅读 · 2 评论 -
LeetCode 200. 岛屿数量
LeetCode 200. 岛屿数量题目描述方法一:深度优先搜索方法二:广度优先搜索方法三:并查集题目描述给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"],原创 2021-08-22 09:16:13 · 339 阅读 · 0 评论 -
LeetCode 383. 赎金信
LeetCode 383. 赎金信题目描述参考代码题目描述给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)示例:输入:ransomNote = “aa”, magazine = “ab”原创 2021-08-22 09:14:23 · 305 阅读 · 0 评论 -
LeetCode 307. 区域和检索 - 数组可修改
这里写目录标题数据结构--SQRT分解数据结构–SQRT分解SQRT分解是一种数据结构使用分块(分组)的思想解决区间问题动态维护分区基本思想:原创 2021-08-14 10:00:45 · 432 阅读 · 0 评论 -
LeetCode 130. 被围绕的区域
LeetCode 130. 被围绕的区域题目描述DFSJavaPythonBFSJavaPython题目描述给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。示例:输入:board = [[“X”,“X”,“X”,“X”],[“X”,“O”,“O”,“X”],[“X”,“X”,“O”,“X”],[“X”,“O”,“X”,“X”]]输出:[[“X”,“X”,“X”,“X”],[“X”,“X原创 2021-08-12 14:16:16 · 632 阅读 · 0 评论 -
LeetCode 96.不同的二叉搜索树
LeetCode 96.不同的二叉搜索树题目描述动态规划JavaPython数学JavaPython机灵鬼题目描述给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。示例:输入:n = 3输出:5动态规划思路给定一个有序序列 1⋯n,为了构建出一棵二叉搜索树,我们可以遍历每个数字 i,将该数字作为树根,将 1⋯(i−1) 序列作为左子树,将 (i+1)⋯n 序列作为右子树。接着我们可以按照同样的方式递归构建原创 2021-08-10 22:25:45 · 483 阅读 · 6 评论 -
LeetCode 91. 解码方法
LeetCode 91. 解码方法题目描述动态规划参考代码JavaPython题目描述一条包含字母 A-Z 的消息通过以下映射进行了 编码 :'A' -> 1'B' -> 2...'Z' -> 26要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:“AAJF” ,将消息分组为 (1 1 10 6)“KJF” ,将消息分组为 (11 10 6)注意,消息不能分组为 (1 11 06) ,因为原创 2021-08-07 22:10:56 · 356 阅读 · 0 评论 -
LeetCode 128. 最长连续序列
LeetCode 128. 最长连续序列题目描述哈希表JavaPython动态规划PythonJava题目描述给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。示例:输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。哈希表我们考虑枚举数组中的每个数 x,考虑以其为起点,不断尝试匹配 x+1,x+2,⋯ 是原创 2021-08-06 21:06:59 · 501 阅读 · 0 评论 -
LeetCode 64. 最小路径和
LeetCode 64. 最小路径和题目描述动态规划参考代码空间优化题目描述给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。动态规划由于路径的方向只能是向下或向右,因此网格的第一行的每个元素只能从左上角元素开始向右移动到达,网格的第一列的每个元素只能从左原创 2021-08-06 20:17:54 · 339 阅读 · 0 评论 -
LeetCode 63. 不同路径 II
LeetCode 63. 不同路径 II题目描述算法思路参考代码题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?示例 1:输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]输出:2解释:3x3 网格的正中间有一个障碍物。从左上角到右下角一原创 2021-08-04 21:14:26 · 315 阅读 · 0 评论 -
LeetCode.172- 阶乘后的零
阶乘后的零1.计算阶乘2.计算因子 5题目描述:给定一个整数 n,返回 n! 结果尾数中零的数量。1.计算阶乘这种方法速度太慢了,但却是一个好的起点。虽然不会在面试中实现它,但是你可以简单的描述它是个解决问题的办法之一。解决这个问题的最简单的办法就是计算 n!,然后计算它的末尾数 0 个数。阶乘是通过将所有在 1 和 n 之间的数字相乘计算的。例如:10!=10⋅9⋅8⋅7⋅6⋅5⋅4⋅3⋅2⋅1=3,628,800。因此,可以使用以下算法迭代计算阶乘。代码展示:Pythondef原创 2021-05-13 12:04:01 · 475 阅读 · 2 评论 -
LeetCode- 柱状图中最大的矩形(单调栈)
柱状图中最大的矩形单调栈经典例题分析BF单调栈单调栈2单调栈单调单调:所以单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈和单调递减栈。单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大伪代码:stack<int> st;//此处一般需要给数组最后添加结束标志符,具体下面例题会有详细讲解for (遍历这个数组){ if (栈空 || 栈顶元素大于等于当前比较元素) { 入栈; } else {原创 2021-05-22 12:29:48 · 592 阅读 · 1 评论 -
LeetCode 62. 不同路径
LeetCode 62. 不同路径题目描述方法一:深度优先搜索方法二:动态规划方法三:组合数学题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28方法一:深度优先搜索时间超限class Solution { public int uniquePaths(i原创 2021-08-03 20:44:43 · 269 阅读 · 0 评论 -
LeetCode 55. 跳跃游戏
LeetCode 55. 跳跃游戏题目描述算法分析参考代码题目描述给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位原创 2021-08-02 19:58:48 · 263 阅读 · 0 评论 -
LeetCode 45. 跳跃游戏 II
LeetCode 45. 跳跃游戏 II题目思路方法一:反向查找出发位置方法二:正向查找可到达的最大位置题目给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。示例:输入: nums = [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达原创 2021-08-01 10:30:58 · 271 阅读 · 0 评论 -
LeetCode- 22. 括号生成
22. 括号生成题目描述暴力枚举回溯法动态规划题目描述数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]输入:n = 1输出:["()"]暴力枚举暴力枚举所有可能的括号情况,n括号数2*n,使用char数组传参,便于回溯,枚举每一种情况。检查括号是否有效,便是左括号右括号数是否相当,当 all < 0此时必然不等,提前r原创 2021-07-13 17:10:11 · 323 阅读 · 0 评论 -
LeetCode- 翻转数位
面试题.翻转数位题目描述算法思路PythonJava题目描述给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。输入: num = 1775(110111011112)输出: 8输入: num = 7(01112)输出: 4算法思路每次维护三个变量:cur:当前位置为止连续1的个数,遇到0归零,遇到1加1insert:在当前位置变成1,往前数连续1的最大个数,遇到0变为cur+1,遇到1加1res:保存insert的最大值原创 2021-07-13 16:04:04 · 338 阅读 · 0 评论 -
LeetCode-LCS 01. 下载插件
LCS 01. 下载插件题目描述贪心选择回溯算法动态规划数学题目描述小扣打算给自己的 VS code 安装使用插件,初始状态下带宽每分钟可以完成 1 个插件的下载。假定每分钟选择以下两种策略之一:使用当前带宽下载插件将带宽加倍(下载插件数量随之加倍)请返回小扣完成下载 n 个插件最少需要多少分钟。注意:实际的下载的插件数量可以超过 n 个示例 :输入:n = 4输出:3解释:最少需要 3 分钟可完成 4 个插件的下载,以下是其中一种方案:第一分钟带宽加倍,带宽可每分钟下载 2原创 2021-07-09 22:05:30 · 453 阅读 · 0 评论 -
leetcode LCP 07. 传递信息
BFS&DFS&DP题目描述DFSBFSDP题目描述小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:1.有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 02.每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。3.每轮信息必须需要传递给另一个人,且信息可重复经过同一个人给定总玩家数 n,以及按 [玩家编号,对应可传递玩家编号] 关系组成的二原创 2021-07-08 23:14:26 · 569 阅读 · 0 评论 -
LeetCode788. 旋转数字
rotated-digits题目描述JAVAPython题目描述我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方(在这种情况下,它们以不同的方向旋转,换句话说,2 和 5 互为镜像);6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。现在我们有原创 2021-07-06 20:06:40 · 347 阅读 · 0 评论 -
LeetCode322. 零钱兑换
动态规划题目描述记忆化搜索动态规划题目描述给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3 解释:11 = 5 + 5 + 1记忆化搜索我们注意到这个问题有一个最优的子结构性质,这是解决动态规划问题的关键。最优解可以从其子问题的最优解构造出来。如何将问题分解原创 2021-07-06 19:20:10 · 277 阅读 · 0 评论 -
LeetCode338. 比特位计数
比特位计数:奇淫技巧questionbitCount()Brian Kernighan 算法最高有效位(DP)最低有效位(DP)最低设置位(DP)question给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]bitCount()这道题需要计算从 0 到 n 的每个整数的二进制表示中的 1 的数目。部分编程语言有相应的内置函数用于计算给定的整数的二进制表示中的 1原创 2021-07-06 16:49:06 · 357 阅读 · 0 评论 -
LeetCode119. 杨辉三角 II
这里写目录标题题目描述算法分析代码实现递推线性递推题目描述给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 3输出: [1,3,3,1]算法分析杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。-原创 2021-07-05 17:37:00 · 405 阅读 · 2 评论