
Leetcode
文章平均质量分 52
__sai_
写作是为了对抗时间的流逝和遗忘。
展开
-
【剑指 Offer】 07. 重建二叉树 | 数组的索引作为递归参数
文章目录题目思路代码题目思路方法非常简单,先序遍历的根在先序数组的第一个元素;而中序遍历的根在中序遍历数组的中间,左边是根的左子树的中序遍历,右边是根的右子树的中序遍历。举例如:先序遍历数组为3、9、20、15、7;中序遍历数组为9、3、15、20、7根节点在先序数组的第一个元素即3而3又可以将中序遍历划分为左右两部分,一部分是9,为3的左子树的中序遍历;另一部分为15、20、7,为3的右子树的中序遍历我们很容易构造一个递归,返回值为根节点,根据先序遍历得到根节点,按照先序遍历将中序遍历分原创 2022-03-23 09:58:12 · 428 阅读 · 0 评论 -
【剑指 Offer】 64. 求1+2+…+n
文章目录题目思路代码题目思路一开始想的是位运算 1+2+…+n=(1+n)n/2位运算实现加法:a+b = a^b + (a&b)<<1位运算实现减法:a-b=a+(-b)=a+(~b+1)位运算实现乘法:a2=a<<1位运算实现除法:a/2=a>>11+n好说,/2好说,n呢?假设n=9,an=a*1001=a<<3+a这样只要一个循环就能用位运算实现题目了但是不能用循环看了题解知道了逻辑运算符的短路效应if(a &原创 2022-03-22 18:49:53 · 871 阅读 · 0 评论 -
【剑指 Offer】 68 - II. 二叉树的最近公共祖先
文章目录题目思路代码题目思路对于某个节点node而言当p、q分别位于node左右子树或者node是p、q中的一个时,node是其最近公共子节点;当p、q都在node左子树里,则递归判断node.left;当p、q都在node右子树里,则递归判断node.right;p、q在node左/右子树,这件事要怎么来判断呢?递归遍历树的左右子树,如果碰到了p、q,则向上返回p、q,否则就向上返回null。如果一个节点的左右子树分别返回p、q,则这个节点就是要求的最近公共祖先,向上返回该节点,原创 2022-03-22 14:57:52 · 448 阅读 · 0 评论 -
【剑指 Offer】 40. 最小的k个数
文章目录题目思路代码题目思路找出最小的k个,可以k次冒泡排序,或者快速排序,当基准的索引为k时返回代码class Solution { public int[] getLeastNumbers(int[] arr, int k) { if(k>=arr.length) return arr; return quickSort(arr,k,0,arr.length-1); } int[] quickSort(int[] arr,int原创 2022-03-21 21:54:52 · 439 阅读 · 0 评论 -
【剑指 Offer】 61. 扑克牌中的顺子
文章目录题目思路代码题目思路注意是若干副扑克牌,所以所有牌都可能重复。除大小王之外,如果有牌重复,就不是顺子。并且除大小王之外的最大点-最小点<5,才有可能是顺子,如果>=5,就不是顺子。在不重复的前提下,根据大小王有几个来分类:5个:是顺子4个:是顺子3个:除大小王之外的最大点-最小点<5则是顺子,否则不是2个:除大小王之外的最大点-最小点<5则是顺子,否则不是1个:除大小王之外的最大点-最小点<5则是顺子,否则不是0个:最大点-最小点<5则是顺原创 2022-03-21 21:20:58 · 610 阅读 · 0 评论 -
【剑指 Offer】 36. 二叉搜索树与双向链表
文章目录题目思路代码题目思路二叉搜索树的中序遍历为递增序列,我们可以中序遍历二叉树,遍历当前节点时,执行:pre.right=node;pre=node;node.left=pre;需要考虑边界条件:遍历第一个点时并无pre,此时pre为空,所以需要加入pre是否为空判断;遍历完成后,第一个点的左指针指向最后一个点,最后一个点的右指针指向第一个点。代码class Solution { Node pre,head; public Node treeToDoublyLi原创 2022-03-21 20:12:23 · 619 阅读 · 0 评论 -
【剑指 Offer】 34. 二叉树中和为某一值的路径 | 搜索与回溯
文章目录题目思路代码题目思路此题同样可用搜索与回溯算法。因为是二叉树,所以用二叉树的遍历此题适用于二叉树的中序遍历,即遍历顺序为左右根。#中序遍历1.访问根节点2.递归访问其左子树3.递归访问其右子树先明确递归的返回类型:题目要求返回路径,所以需要一个全局变量来存储路径,如果符合条件,就将节点加入路径,否则不加入。则递归的返回类型可以设为void,符合条件,将节点加入路径;不符合条件,直接return。边界条件:节点为空,return;节点值大于target,return;原创 2022-03-21 19:57:29 · 1250 阅读 · 0 评论 -
【剑指 Offer】 13. 机器人的运动范围 | 搜索与回溯
文章目录题目思路分析题目思路分析先解决位数之和的问题mn范围是0-100,坐标[m-1,n-1]范围是0-99在0-99之内,都满足如下条件:当发生进位时,位数之和-8;当不发生进位时,位数之和+1。如:19->20,位数之和从10到2,29->30,位数之和从11到3;33->34,位数之和从6到7。可以表示为:设当前元素为x,其位数和为sx,则x+1的位数和为sum_of_digits = (x+1)%10 == 0 ? sx-8 : sx+1本题机器人规定了起始位原创 2022-03-21 16:59:05 · 157 阅读 · 0 评论 -
【剑指 Offer】 12. 矩阵中的路径 | 搜索与回溯
文章目录题目思路构造递归代码题目思路本题可以用搜索与回溯算法,本质上是递归,当遍历到当前元素时,递归遍历当前元素的上、左、下、右方元素构造递归1.边界条件行列超出索引,返回false;当前元素与字符串单词不符,返回false;当前元素已经匹配到字符串单词最后一位,返回true;2.递归处理当当前元素与字符串单词相符,但是并没有匹配到最后一位时将当前元素置为’ ',避免重复访问递归访问当前元素的上、左、下、右方元素将当前元素恢复返回第2步的调用结果(四个调用只要有一个tr原创 2022-03-21 16:25:29 · 376 阅读 · 0 评论 -
【剑指 Offer】 48. 最长不含重复字符的子字符串
题目思路此题可以用动态规划定义状态:dp[i]为以s中第i位字符结尾的不包含重复字符的子字符串状态转移方程:如果s中第i位字符没有与前面的子字符串里的字符重复,则dp[i]=dp[i-1]+1;如字符串ab,dp[1]=1,b没有与前面重复,则dp[2]=dp[1]+1=2。如果s中第i位字符重复了,则dp[i]=i-重复处索引如字符串aba,dp[1]=1,dp[2]=2,第三位的a与前面重复了,重复处为第1位,则dp[3]=3-1=2。初始值:当s为空时,最长的不包含重复字原创 2022-03-05 17:12:10 · 230 阅读 · 0 评论 -
【剑指 Offer】 46. 把数字翻译成字符串
题目思路此题可用动态规划求解定义状态:dp[i]表示第i位数结尾时,有几种翻译方式返回值:返回dp[nums.length]状态转移方程如果第i位数不可以与前面第i-1位数连着翻译,则第i位数只有一种翻译方式,如58中的8只能翻译成i,那么dp[i]=dp[i-1]如果第i位数可以与前面第i-1位数连着翻译,则第i位数有两种翻译方式,如12中的2,可以翻译成c,此时dp[i]=dp[i-1];也可以12连起来翻译成m,此时dp[i]=dp[i-2]。所以dp[i]=dp[i-1]+dp[原创 2022-03-05 15:58:44 · 509 阅读 · 0 评论 -
【剑指 Offer】 47. 礼物的最大价值
题目思路右下角grid[m][n]最多能拿到多少礼物只与grid[m-1][n]与grid[m][n-1]最多能拿到多少礼物以及他们本身的值有关,这题可以用动态规划求解。定义状态:dp[i][j]代表走到第i行第j列能拿到的最大的礼物状态转移方程当i=0时,即在第0行,只能由dp[0][j-1]向右走向dp[0][j],所以dp[0][j]=dp[0][j-1]+grid[0][j]当j=0时,即在第0列,只能由dp[i-1][0]向下走向dp[i][0],所以dp[i][0]=dp[i-原创 2022-03-05 14:51:30 · 389 阅读 · 0 评论 -
【剑指 Offer】 42. 连续子数组的最大和
题目思路此题用动态规划定义状态:用dp[i]表示以元素nums[i]结尾的连续子数组的和(注意是和,不是题目中的最大和)状态转移方程:如果dp[i-1]<0,说明前面的贡献是负的,即dp[i-1]+nums[i]还不如nums[i]大,此时dp[i]=nums[i]如果dp[i-1]>=0,dp[i]=dp[i-1]+nums[i]可以简化为:dp[i]=Math.max(nums[i],dp[i-1]+nums[i])边界值:dp[0]=nums[0],表示以第一个元素结尾原创 2022-03-05 11:30:55 · 528 阅读 · 0 评论 -
【剑指 Offer】 28. 对称的二叉树
题目思路一棵树是镜像对称的,当且仅当它的左右子树是镜像对称的,如图:而两棵树A,B镜像对称,当且仅当满足以下条件:两棵树的根节点数值相等A左子树与B右子树镜像对称,A右子树与B左子树镜像对称构造递归当A,B节点都为空时,A、B树是镜像对称的。返回true当A,B节点只有一个为空时,A、B树不是镜像对称的。返回false当A,B节点都不为空时,如果A、B数值不等,A、B树不是镜像对称的。返回false当A,B节点都不为空时,如果A、B数值相等,则递归判断是否满足条件“A左子原创 2022-03-03 16:39:13 · 302 阅读 · 0 评论 -
【剑指Offer】27. 二叉树的镜像
题目思路要想输出这颗树的镜像,只需要递归交换左右子树即可。递归的构造终止条件:当前节点为空时,即到达终止条件递归:交换当前节点的左右子树当前节点的左右子树也递归执行该函数。代码class Solution { public TreeNode mirrorTree(TreeNode root) { if(root==null)return root; exchange(root); return root; }原创 2022-03-03 16:05:26 · 249 阅读 · 0 评论 -
【剑指 Offer】26. 树的子结构
解题思路如果B树是A树的子树,则A树中必有一个节点的数值与B树的根节点数值相同。因此,判断B树是否是A树的子树分为两步:遍历A树,找出与B树根节点数值相同的节点node判断B树是否为以node为根节点的子树。空树不是任意一个树的子结构,如果B树为空,返回false;如果A树为空,则B不管是否为空也不可能是A的子树,返回false。遍历A树,找出与B树根节点数值相同的节点node随便用什么遍历方式都行注意,A树中可能有多个与B树根节点数值相同的节点node,所以找到满足条件的node之后就判原创 2022-02-28 17:30:41 · 229 阅读 · 0 评论 -
【leetcode】二叉树
参考:https://gitee.com/programmercarl/leetcode-master目录一、二叉树的遍历144. 二叉树的前序遍历145. 二叉树的后序遍历94. 二叉树的中序遍历102. 二叉树的层序遍历二、二叉树的属性101. 对称二叉树104. 二叉树的最大深度111. 二叉树的最小深度一、二叉树的遍历144. 二叉树的前序遍历class Solution { public List<Integer> preorderTraversal(TreeNode原创 2021-10-11 12:09:50 · 84 阅读 · 0 评论 -
【leetcode】栈与队列
参考:https://gitee.com/programmercarl/leetcode-master目录Java创建栈232. 用栈实现队列225. 用队列实现栈20. 有效的括号1047. 删除字符串中的所有相邻重复项150. 逆波兰表达式求值Java创建栈import java.util.Stack;Stack<Integer> s = new Stack<Integer>(); 只能装整形的栈Stack<Character> s = new Stack原创 2021-10-11 10:45:22 · 163 阅读 · 0 评论 -
【leetcode】字符串
1原创 2021-10-10 15:43:34 · 98 阅读 · 0 评论 -
【leetcode】哈希表
1原创 2021-10-10 11:27:12 · 205 阅读 · 0 评论 -
【leetcode】链表
1原创 2021-10-09 21:51:04 · 96 阅读 · 0 评论 -
【leetcode】数组
目录一、二分查找704.二分查找35.搜索插入位置34. 在排序数组中查找元素的第一个和最后一个位置69. Sqrt(x)367. 有效的完全平方数二、双指针27. 移除元素参考:https://gitee.com/programmercarl/leetcode-master一、二分查找704.二分查找题目:一开始的朴素解法:class Solution { public int search(int[] nums, int target) { int low=0,hi原创 2021-10-09 19:02:37 · 515 阅读 · 0 评论