leetcode刷题本
chenyson
一名很“懒”、会养细胞的程序员
展开
-
leetcode 3. 无重复字符的最长子串
难度:中等频次:319题目:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。解题思路:滑动窗口代码class Solution { public int lengthOfLongestSubstring(String s) { Map<Character,Integer> hashmap=new HashMap<Character,Integer>(); int maxlen=0; int le原创 2022-03-06 21:16:31 · 357 阅读 · 0 评论 -
leetcode 40. 组合总和 II
难度: 中等频次:19题目:给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。解题思路:回溯注意:注意这里是不能出现顺序不一样,但是内容一样的结果还是用for,然后start+1 这是全遍历结果上面的结果还会出现重复的,所以需要减枝减枝: 先排序,然后如果在同一个节点下,如果两个节点的大原创 2022-03-04 22:18:27 · 354 阅读 · 0 评论 -
leetcode 39. 组合总和
难度:中等频次:49给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。解题思路:回溯 (DFS+剪枝)注意:用for+star原创 2022-03-04 21:24:33 · 2467 阅读 · 0 评论 -
leetcode 34. 在排序数组中查找元素的第一个和最后一个位置
难度:中等频次:46题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?解题思路:logn +有序 ==二分查找代码class Solution { public int[] searchRange(int[] nums, int target) { int原创 2022-03-01 23:40:38 · 2362 阅读 · 0 评论 -
leetcode 122. 买卖股票的最佳时机 II
难度:中等频次:35题目:给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。返回 你能获得的 最大 利润 。解题方法:动态规划、暴力解法[两遍循环]动态规划用于多阶段决策问题;动态规划问题的问法:只问最优解,不问具体解;掌握无后效性解决动态规划问题:把约束条件设置成为状态。解题思路:1.题目只问最大利润,没有问这几天具体哪一天原创 2022-03-01 23:11:26 · 1697 阅读 · 0 评论 -
leetcode 518. 零钱兑换 II
难度:中等频次:28题目:给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。题目数据保证结果符合 32 位带符号整数。解题思路:完全背包的组合问题注意:背包问题的解析查看背包类型0-1 背包 : 背包里的元素只能用一次先背包循环,后target循环(倒序),且target>num[i]完全背包 : 背包里的原创 2022-03-01 22:07:53 · 298 阅读 · 0 评论 -
322. 零钱兑换
难度:中等频次:52题目:给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。解题思路:完全背包的最小值问题注意:背包问题的解析查看背包类型0-1 背包 : 背包里的元素只能用一次先背包循环,后target循环(倒序),且target>num[i]完全背包 : 背包里的元素能够重复利用原创 2022-03-01 21:58:52 · 279 阅读 · 0 评论 -
leetcode 470. 用 Rand7() 实现 Rand10()
难度:中等频次:55题目:给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数,试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。你只能调用 rand7() 且不能调用其他方法。请不要使用系统的 Math.random() 方法。每个测试用例将有一个内部参数 n,即你实现的函数 rand10() 在测试时将被调用的次数。请注意,这不是传递给 rand10() 的参数。解题思路:数学规律规律1:randX-1=【0,X-1】==arandY=【1,Y】原创 2022-03-01 20:08:28 · 1707 阅读 · 0 评论 -
leetcode 1047. 删除字符串中的所有相邻重复项
难度:中等频次:17题目:给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。解题思路:用栈辅助,更栈顶的数据比较,不相等就入栈,相等就出栈代码:class Solution { public String removeDuplicates(String s) { Stack<Character> stack=ne原创 2022-02-27 22:51:45 · 284 阅读 · 0 评论 -
多写写 leetcode 43. 字符串相乘
难度:中等频次:55题目:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。解题思路: 拆出来的乘法最后的结果是string,最后用string+string得出string注意:前提先掌握字符串的相加string下的==和equals的区别得反转代码class Solution { public String mult原创 2022-02-27 22:09:43 · 198 阅读 · 0 评论 -
多看看把,条件太多了--leetcode 93. 复原 IP 地址
难度:中等频次:62题目:有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不原创 2022-02-26 23:11:22 · 1691 阅读 · 0 评论 -
leetcode 22. 括号生成
难度:中等频次:62题目:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。解题思路:DFSDFS注意构造一棵树,只要遍历就行了递归结束条件是 left right(每次遍历一个节点就为0) 的值为0需要剪枝,条件是需要left>right[因为这道题的前提就是,一个字符串里”(“必须要比“)”多,才有机会合成,不然你剩下一堆的”("没地方用]每次遍历都需要判断条件,只有left和right>0才有必要进行相应的遍历代码c原创 2022-02-26 21:36:27 · 172 阅读 · 0 评论 -
leetcode 155. 最小栈
难度:简单频次:59题目:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。实现 MinStack 类:MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int getMin() 获取堆栈中的最小元素。解题思路: 用辅助栈||只用一个栈用辅助栈注意:因为提示里的pop等操作都是在非空栈上调用,所以不用考虑太多初始化原创 2022-02-26 21:08:46 · 215 阅读 · 0 评论 -
leetcode 232. 用栈实现队列
难度:简单频次:94题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop原创 2022-02-26 20:29:20 · 212 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表
难度:中等频次:37题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。特别地,我们希望可以就地完成转换操作。当转化完成以原创 2022-02-26 01:24:25 · 59 阅读 · 0 评论 -
leetcode 98. 验证二叉搜索树
难度:中等频次:98题目:给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。解题思路:中序遍历递归法注意:搜索二叉树的中序遍历是一个递增数组只要每次中间的时候判断是否代码:/** * Definition for a binary tree node. * public class TreeNode {原创 2022-02-26 01:02:47 · 245 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点
难度:简单频次:35题目:给定一棵二叉搜索树,请找出其中第 k 大的节点的值。解题思路:递归法 DFS注意:最大的亮点:就是中序遍历后是一个递增序列做一遍中序遍历,然后再get一下倒数第k个即可代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(原创 2022-02-26 00:33:42 · 185 阅读 · 0 评论 -
leetcode 226. 翻转二叉树
难度:简单频次:47题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。解题思路:1.DFS遍历的时候反转root的左右节点即可2.后者用队列模拟栈模拟递归代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} *原创 2022-02-26 00:04:42 · 160 阅读 · 0 评论 -
leetcode 78. 子集
难度:中等频次:53题目:给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。解题思路: 递归+回溯递归解法注意:res添加temp在结束条件之前通过层数判断结束条件从左到有迭代temp添加元素搜索下一层回溯递归回溯代码class Solution { List<List<Integer>> res=new ArrayList<List原创 2022-02-25 23:59:54 · 79 阅读 · 0 评论 -
leetcode 113. 路径总和 II
难度:中等频次:60题目:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。解题思路:DFS 递归注意:递归结束条件添加到res的条件Deque 的用法 offerLast pollLast一棵树的左右节点遍历完要把root从队列里poll出来代码/** * Definition for a binary tree node. * public class原创 2022-02-25 23:06:43 · 69 阅读 · 0 评论 -
leetcode 129. 求根节点到叶节点数字之和
难度:中等频次:64题目:给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。每条从根节点到叶节点的路径都代表一个数字:例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。计算从根节点到叶节点生成的 所有数字之和 。叶节点 是指没有子节点的节点。解题思路:DFS迭代注意:DFS迭代的时候,终止条件是root==null,所以起始i每一条路径都有两个相等的和被放到res里,最后和得除以2注意叶子节点最终的结果su原创 2022-02-25 01:47:11 · 223 阅读 · 0 评论 -
leetcode 62. 不同路径
难度:中等频次:43题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?解题思路:DFS迭代(超时…)||动态规划注意:我自己写的版本,创建多一行,dp[m][n]代表的是m x n一共的不同路径和起始状态dp[1][1]状态转移方程分为3部分- 第一部分 上边界, dp[i][j]=dp[i][j-1];-原创 2022-02-25 01:28:53 · 77 阅读 · 0 评论 -
leetcode 112. 路径总和
难度:简单频次:52题目:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。解题思路:DFS递归||普通递归DFS递归代码/** * Definition for a binary tree node. * public class TreeNode { * int原创 2022-02-25 00:31:55 · 159 阅读 · 0 评论 -
leetcode 31. 下一个排列
难度:中等频次:题目:整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排原创 2022-02-24 23:54:36 · 96 阅读 · 0 评论 -
leetcode 151. 翻转字符串里的单词
难度:中等频次:69题目:给你一个字符串 s ,逐个翻转字符串中的所有 单词 。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。说明:输入字符串 s 可以在前面、后面或者单词间包含多余的空格。翻转后单词间应当仅用一个空格分隔。翻转后的字符串中不应包含额外的空格。解题思路:一次遍历(倒序+标记位置+截取)注意遍历的时候分成两种形式,第一种是遍历跳过空格,直到非空格的位置,一种是遍历非空格,原创 2022-02-24 22:26:45 · 94 阅读 · 0 评论 -
leetcode 169. 多数元素
难度:简单频次:48给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。解题思路:摩尔投票法注意这一题主要是思路你把每一个数字的意义当成一个国家,然后数字的多少相当于兵力的多少。[1,2,7,4,5,6,7,7,7,7,5,4,7,7,7]假设上面的例子是多国混战,那么如果规则是1打1(数量),同归于尽 ,那么众数代表的国家一定会赢。因为最坏的情况就是其他的国家联合在一起跟原创 2022-02-23 23:47:43 · 370 阅读 · 0 评论 -
leetcode 2. 两数相加
难度:中等频次:72给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。注意:不要受逆序影响,他本来就是为了你方便做,给你逆序的。解题思路:遍历【按加法运算来即可】注意 //先算个位,个位值不影响进位 value=(add+t1+t2)%10; //而进位会影响进位原创 2022-02-23 23:21:25 · 103 阅读 · 0 评论 -
leetcode 8. 字符串转换整数 (atoi)
难度:中等频次:75题目:请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数原创 2022-02-23 22:39:23 · 192 阅读 · 0 评论 -
leetcode 56. 合并区间
难度:中等频次:83题目以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间解题思路: 用排序辅助判断前后元素是否有交集即可注意:排序用了Arrays类自带的静态函数sort,并且借助了lambda表达式(v1,v2)-> v1[0]-v2[0])用k计数新的res里一共有多少个元素迭代用 for(int[] interv原创 2022-02-23 20:33:12 · 290 阅读 · 0 评论 -
leetcode 101. 对称二叉树
难度:简单频次:53题目:给你一个二叉树的根节点 root , 检查它是否轴对称。解题思路:DFS递归注意:这里root不允许为空,树节点为1,1000之间这里的DFS是返回boolean值,返回为boolean值的递归都是在return上面做的而且每个DFS里都需要做两个递归左节点的左节点和右节点的右节点----对称节点左节点的右节点和右节点的左节点----对称节点递归的结束条件有3个左右节点都为null,对称左右节点有1个为null,不对称左右节点存在且不相等原创 2022-02-22 23:39:05 · 270 阅读 · 0 评论 -
leetcode 543. 二叉树的直径
难度:简单频次:57题目:给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。解题思路:递归方法注意:类似使用递归的有- leetcode 110. 平衡二叉树- leetcode 104. 二叉树的最大深度其实本质就是求某一个节点左右子树深度和【left+right】的最大值在递归循环体里添加一个res,负责添加每一个节点的左右子树深度和,最后返回res最大值即可。代码/** * Definit原创 2022-02-22 23:13:12 · 215 阅读 · 0 评论 -
leetcode 110. 平衡二叉树
难度:简单频次:61题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。解题思路:算深度+递归注意这里算深度的递归函数,其实跟104 二叉树的最大深度的拆分树的递归版本一行,基本一字不差。在主函数里就两个东西- 判断是否为空,为空返回true- 判断是否符合三个条件- 当前子树是否符合高度差为1- 左子树是否符合- 右子树是否符合代码/** * Definition原创 2022-02-22 22:50:41 · 73 阅读 · 0 评论 -
leetcode 104. 二叉树的最大深度
难度:简单频次:65题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。解题思路:递归DFS递归递归注意拿到节点,先判断是否为空将整个树拆分成root、左子树、右子树递归求左子树的最大深度、右子树的最大深度然后求其最大值,最后再加上root这一层代码/** * Definition for a binary tree node. * public class TreeNode {原创 2022-02-22 22:23:20 · 70 阅读 · 0 评论 -
leetcode 199. 二叉树的右视图
难度:中等频次:91题目:给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。解题思路:BFS 广度优先搜索----其实像一些层序遍历,都优先BFSDFS 深度优先搜索----先中后序都使用DFSBFS跟这道题类似的还有102 二叉树的层序遍历103 二叉树的锯齿形层序遍历注意:用一个队列辅助,我这里用的是双端队列用一个n标记每次队列一开始有几个元素poll出元素的时候,判断i是否是之前最后一个元素,是的话,添加到原创 2022-02-22 21:41:00 · 328 阅读 · 0 评论 -
leetcode 105. 从前序与中序遍历序列构造二叉树
难度:中等频次:68题目:给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。解题思路:递归注意:**规律:**先序遍历的根节点在最前面,中序遍历的根节点在相对中间的地方所以只要每次都找到根节点,然后去掉根节点,把两个先序数组和中序数组都分别拆成2个数组然后用左边的两个数组对root.left使用递归就行,右边同理Arrays.copyOfRange(List,a,b原创 2022-02-22 20:43:54 · 171 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
难度:简单频次:18输入两个链表,找出它们的第一个公共节点。如下面的两个链表:解题思路:双指针法 浪漫相遇,根据距离相等代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * }原创 2022-02-21 23:16:54 · 77 阅读 · 0 评论 -
leetcode 145. 二叉树的后序遍历
难度:中等频次:31题目:给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。解题思路:递归法迭代法递归法(DFS)代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) {原创 2022-02-21 22:56:43 · 305 阅读 · 0 评论 -
leetcode 144. 二叉树的前序遍历
难度:简单频次:74题目:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。解题思路:递归法迭代法递归法代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.原创 2022-02-21 21:48:22 · 227 阅读 · 0 评论 -
leetcode 94. 二叉树的中序遍历
难度:中等频次:94题目:给定一个二叉树的根节点 root ,返回它的 中序 遍历。首先说说二叉树的遍历的四种方式:先序遍历中序遍历后序遍历层级遍历先/中/后序遍历的本质其实是看root根节点放在哪个顺序里遍历,如果root放在前面先遍历,就是先序遍历;如果是放在中间,先左,再中,最后右,就是中序遍历;同理可能后序遍历。而层级遍历就是一层一层来。解题思路:递归法迭代法递归法代码:/** * Definition for a binary tree node.原创 2022-02-21 21:35:28 · 292 阅读 · 0 评论 -
多看看 leetcode 128. 最长连续序列
难度:中等频次:42题目:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。解题思路:因为要O(n),不能重新排序,hashmap+动态规划可以hashmap+set(去重+判断当都一个key是否存在)注意:创建一个hashma放nums中的元素如果num之前没有放到hashmap中- 读取num-1 num+1值的连续序列值,分别作为left和right- 计算加上num的原创 2022-02-19 23:59:06 · 200 阅读 · 0 评论