- 博客(174)
- 收藏
- 关注
原创 LeetCode-538-把二叉搜索树转换为累加树
LeetCode-538-把二叉搜索树转换为累加树 思路 逆中序遍历,右中左,使用一个全局变量保存当前的和 代码 class Solution { int sum=0; public TreeNode convertBST(TreeNode root) { Travel(root); return root; } public void Travel(TreeNode root){ if(root==null) return;
2021-09-14 10:23:06
147
原创 LeetCode-543-二叉树的直径
LeetCode-543-二叉树的直径 思路 计算左右最大深度和 代码 class Solution { int m=0; public int diameterOfBinaryTree(TreeNode root){ dfs(root); return m; } public int dfs(TreeNode root){ if(root==null) return 0; int l=dfs(root.lef
2021-09-14 10:22:55
156
原创 LeetCode-437-路径总和III
LeetCode-437-路径总和III 思路 判断以当前根节点为起点,再以左右节点为起点遍历即可 代码 class Solution { int cnt=0; public int pathSum(TreeNode root, int targetSum) { if(root==null)return 0; getSum(root,targetSum); pathSum(root.left,targetSum); pathS
2021-09-13 09:26:50
170
原创 LeetCode-102-二叉树的层序遍历
LeetCode-102-二叉树的层序遍历 思路 使用BFS和队列即可 代码 class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> ans=new ArrayList<>(); if(root==null) return ans; Queue&l
2021-09-13 09:26:44
98
原创 LeetCode-101-对称二叉树
LeetCode-101-对称二叉树 思路 一棵树,判断左右节点是否满足对称,以及左右节点的左左右右,左右右左 代码 class Solution { public boolean isSymmetric(TreeNode root) { if(root==null)return true; return helper(root.left,root.right); } public boolean helper(TreeNode L,TreeNode
2021-09-13 09:26:36
77
原创 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 思路 因为是二叉搜索树,因此可以判断起来比较容易,节点只可能在左右子树 如果都小于根结点,那么就查看是否在左子树 如果都大于根结点,那么就查看是否在右子树 否则,直接返回根节点 代码 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(p.val<root.val&&q.val<root
2021-09-13 09:26:21
62
原创 剑指 Offer 64. 求1+2+…+n
剑指 Offer 64. 求1+2+…+n 思路 注意,该题不允许使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C) 因此只能考虑使用位运算 通过位运算来递归加法 代码 class Solution { int res=0; public int sumNums(int n) { boolean x=(n>1)&&sumNums(n-1)==1; res+=n; r
2021-09-13 09:23:17
74
原创 剑指 Offer 55 - II. 平衡二叉树
剑指 Offer 55 - II. 平衡二叉树 思路 老样子 1.当前节点为根节点,是否平衡 2.左右节点为根节点,是否平衡 代码 class Solution { public boolean isBalanced(TreeNode root) { if(root==null)return true; int l=dfs(root.left),r=dfs(root.right); return (Math.abs(l-r)<=1)&&
2021-09-13 09:23:07
79
原创 剑指 Offer 68 - II. 二叉树的最近公共祖先
剑指 Offer 68 - II. 二叉树的最近公共祖先 思路 注意,这里不是二叉搜索树了 因此判断方法有点区别 如果根节点为空,或者根节点等于某个节点那么直接返回根结点 以左右节点去搜索 如果左右都为空,直接返回null 如果左为空右不空,返回右节点 如果右为空左不空,返回左节点 如果左右都不可,返回根节点 代码 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(roo
2021-09-13 09:22:55
70
原创 剑指 Offer 67. 把字符串转换成整数
剑指 Offer 67. 把字符串转换成整数 思路 1.判断第一位是不是+/- 2.判断是否存在非数字 3.判断是否越界,越界返回极值 极值是Integer.MAX_VALUE,由于我们是逐位转化的,因此考虑极值Integer.MAX_VALUE/10,如果当前值大于Integer.MAX_VALUE/10,直接返回极值;如果当前值等于Integer.MAX_VALUE/10,然后当前个位>7,也直接返回极值。 4.res=10*res+ch[i]-‘0’ 代码 public int str
2021-09-13 09:22:42
109
原创 剑指 Offer 65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法 思路 使用位运算,同时必须考虑进位 参考 面试题65. 不用加减乘除做加法(位运算,清晰图解) - 不用加减乘除做加法 - 力扣(LeetCode) (leetcode-cn.com) 代码 public int add(int a, int b) { while(b!=0){//进位和不为0 int c=(a&b)<<1;//计算进位和 a^=b;//计算和
2021-09-13 09:21:50
78
原创 剑指 Offer 62. 圆圈中最后剩下的数字
剑指 Offer 62. 圆圈中最后剩下的数字 思路 约瑟夫环,只是不是链表 暴力法不可以 参考 剑指 Offer 62. 圆圈中最后剩下的数字(数学 / 动态规划,清晰图解) - 圆圈中最后剩下的数字 - 力扣(LeetCode) (leetcode-cn.com) 这里推导有点难懂 存在递推 dp[i]=(dp[i−1]+m)%i 最后返回dp[n] 代码 int []dp=new int[n+1]; for(int i=2;i<=n;i++){
2021-09-12 10:19:53
75
原创 剑指 Offer 61. 扑克牌中的顺子
剑指 Offer 61. 扑克牌中的顺子 思路 1.为了更好地检查顺子,那么就先对数组进行排序 2.遍历数组,计算0(鬼牌的数量) 3.遍历时,如果存在除0外相同的牌,那么直接返回false 4.最后判断最后一张牌和第一张非鬼牌的差距是否小于5,在5之内说明可以用鬼牌弥补顺序 代码 public boolean isStraight(int[] nums) { int j=0; Arrays.sort(nums); for(int i=0;i<
2021-09-12 10:19:35
81
原创 剑指 Offer 60. n个骰子的点数
剑指 Offer 60. n个骰子的点数 思路 暴力,不可以,因为是指数增长的6 ^ n 那么就找规律吧 参考 剑指 Offer 60. n 个骰子的点数(动态规划,清晰图解) - n个骰子的点数 - 力扣(LeetCode) (leetcode-cn.com) 代码 public double[] dicesProbability(int n) { double []dp=new double[6]; Arrays.fill(dp,1.0/6.0);
2021-09-12 10:19:23
75
原创 剑指 Offer 58 - II. 左旋转字符串
剑指 Offer 58 - II. 左旋转字符串 思路 遍历就好 代码 public String reverseLeftWords(String s, int n) { StringBuilder res=new StringBuilder(""); for(int i=n;i<s.length();i++){ res.append(s.charAt(i)+""); } for(int i=0;i<
2021-09-12 10:19:07
66
原创 剑指 Offer 59 - II. 队列的最大值
剑指 Offer 59 - II. 队列的最大值 思路 这里一开始或许会以为和最小栈一样,但是并不一样,比如入队2,队列2,最大队列2,入队4,队列2,4,最大队列2,4,那么这个时候求最大队列值,弹出2,这是不对的。因此应该换种思路 维护一个双向队列,该队列应该是单调递减的 当入队时,如果入队元素大于队尾元素,那么就依次出队尾,然后入队 当出队时,如果出队元素等于队首元素,那么也出队首 代码 class MaxQueue { Queue<Integer> q1; Deque&
2021-09-12 10:18:56
69
原创 剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - I. 翻转单词顺序 思路 从后往前遍历 添加即可 代码 public String reverseWords(String s) { s=s.trim(); StringBuilder res=new StringBuilder(""); int i=s.length()-1,j=i; while(i>=0){ while(i>=0&&s.charAt(i
2021-09-12 10:18:44
79
原创 剑指 Offer 57 - II. 和为s的连续正数序列
剑指 Offer 57 - II. 和为s的连续正数序列 思路 滑动窗口 代码 public int[][] findContinuousSequence(int target) { List<int []>res=new ArrayList<>(); int i=1,j=2,s=3; while(i<j){ if(s==target){ int []tmp=new in
2021-09-12 10:18:32
70
原创 剑指 Offer 56. 数组中数字出现的次数(I、II)
剑指 Offer 56 - I. 数组中数字出现的次数 思路 异或 这次有2个出现一次的数,因此异或的结果是两个数的异或。必须想办法分开。 这两个数肯定是不一样的,那么我们取异或结果的最右边的1(x&(-x)),可以通过这一位来区分。 然后把这两组元素分别异或,得到2个数就是所求数 代码 public int[] singleNumbers(int[] nums) { int []res=new int[2]; int xor=0; for(
2021-09-12 10:18:06
70
原创 剑指 Offer 26. 树的子结构
剑指 Offer 26. 树的子结构 思路 1.当 树 A 为空 或 树 B 为空 时,直接返回 false ; 2.比较当前两个节点为根节点是否一致 3.比较A节点的左右子树与B是否一致 代码 public boolean isSubStructure(TreeNode A, TreeNode B) { return (A!=null&&B!=null)&&(helper(A,B)||isSubStructure(A.left,B)||isSubStru
2021-09-12 10:17:36
53
原创 剑指 Offer 54. 二叉搜索树的第k大节点
剑指 Offer 54. 二叉搜索树的第k大节点 思路 由于是二叉搜索树,因此只需要按照中序遍历即可,但是它要求找到第k大的值,因此应该反中序遍历 代码 class Solution { int res,k; public int kthLargest(TreeNode root, int k) { this.k=k; dfs(root); return res; } public void dfs(TreeNode root
2021-09-11 09:22:57
59
原创 剑指 Offer 53 - II. 0~n-1中缺失的数字
剑指 Offer 53 - II. 0~n-1中缺失的数字 思路 这里仔细研究一下,可以发现题目描述有些不正确,正确意思应该是在一个长度为n的数组中,每个数字都是唯一的,数字范围是0 ~ n,那么说明有一个数字不存在,因此只需要对所有元素依次异或,然后异或1 ~ n,那么最后得到的值就是不出现的数字 代码 public int missingNumber(int[] nums) { int res=0; for(int i=0;i<nums.length;i++
2021-09-11 09:22:47
76
原创 剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I 思路 二分法查找最右值(可能有多个,因此找最右边的) 然后查找target和target-1,返回的最右值差就是target的个数 代码 public int search(int[] nums, int target) { return helper(nums,target)-helper(nums,target-1); } int helper(int[] nums, int target) {
2021-09-11 09:22:35
55
原创 剑指 Offer 49. 丑数
剑指 Offer 49. 丑数 思路 丑数的定义:只包含质因子 2、3 和 5 的数称作丑数(Ugly Number) 这里其实少说了一点,由2、3、5乘丑数的数也是丑数 如8=24=22*2,4是丑数,8也是丑数 那么我们只需要以dp数组乘2、3、5,得到的结果最小值就是当前位置丑数, dp[0]=1,丑数下标a、b、c都为0 代码 public int nthUglyNumber(int n) { int a=0,b=0,c=0; int []dp=new in
2021-09-11 09:21:42
65
原创 剑指 Offer 48. 最长不含重复字符的子字符串
剑指 Offer 48. 最长不含重复字符的子字符串 LeetCode-003-无重复字符的最长子串
2021-09-11 09:21:22
64
原创 剑指 Offer 47. 礼物的最大价值
剑指 Offer 47. 礼物的最大价值 思路 经典动态规划 初始化首行首列,dp[i][j]=max(dp[i-1][j],dp[i][j-1]) 代码 public int maxValue(int[][] grid) { int m=grid.length,n=grid[0].length; int [][]dp=new int[m][n]; dp[0][0]=grid[0][0]; for(int i=1;i<m;i++
2021-09-11 09:21:07
55
原创 剑指 Offer 46. 把数字翻译成字符串
剑指 Offer 46. 把数字翻译成字符串 思路 动态规划 1.dp[i]表示[0…i]所能翻译的种类 2.一次可以翻译1个或者2个数字,那么如果i-1、i位都可以那么dp[i]=dp[i-2]+dp[i-1];否则dp[i]=dp[i-1] 3.dp[0]=dp[1]=1;dp[1]等于1显而易见,一个数字肯定可以翻译;dp[0]的解释就是,dp[0]=dp[2]-dp[1],也就是如果0、1位置合起来可以翻译,那么dp[2]=2,dp[0]=1 代码 public int translateN
2021-09-11 09:20:47
71
原创 剑指 Offer 45. 把数组排成最小的数
剑指 Offer 45. 把数组排成最小的数 思路 看一下下面这个例子, 存在元素3、30,把他们连接起来,那么就有3+30=330,30+3=303,也就是30+3<3+30,那么我们只要按照这个规律连接所有元素就好。因此需要把所有元素转化成字符串,通过比较x+y和y+x的大小,如果x+y<y+x,那么x放前面,y放后面 代码 public String minNumber(int[] nums) { String []strs=new String[nums.len
2021-09-11 09:20:18
63
原创 剑指 Offer 50. 第一个只出现一次的字符
剑指 Offer 50. 第一个只出现一次的字符 思路 使用哈希表存放次数,这里其实用Boolean作为值,值为!set.containsKey(key),如果第一次那么就会是true,多次就都是false 代码 public char firstUniqChar(String s) { HashMap<Character,Boolean> map=new HashMap<>(); char []ch=s.toCharArray();
2021-09-10 09:28:20
61
原创 剑指 Offer 44. 数字序列中某一位的数字
剑指 Offer 44. 数字序列中某一位的数字 思路 参考 面试题44. 数字序列中某一位的数字(迭代 + 求整 / 求余,清晰图解) - 数字序列中某一位的数字 - 力扣(LeetCode) (leetcode-cn.com) 这是道数学题,找规律 1.确定n所在 数字 的 位数 ,记为digit ; 2.确定n所在的 数字 ,记为num ; 3.确定n是num中的哪一数位,并返回结果。 代码 public int findNthDigit(int n) { int digit
2021-09-10 09:27:53
96
原创 剑指 Offer 34. 二叉树中和为某一值的路径
剑指 Offer 34. 二叉树中和为某一值的路径 思路 从根节点到叶节点的路径和等于目标值 需要获得路径,回溯即可,在最后回退 代码 class Solution { List<List<Integer>> res=new ArrayList<>(); LinkedList<Integer> path=new LinkedList<>(); public List<List<Integer>> p
2021-09-10 09:27:39
59
原创 剑指 Offer 33. 二叉搜索树的后序遍历序列
剑指 Offer 33. 二叉搜索树的后序遍历序列 思路 参考 面试题33. 二叉搜索树的后序遍历序列(递归分治 / 单调栈,清晰图解) - 二叉搜索树的后序遍历序列 - 力扣(LeetCode) (leetcode-cn.com) 后序遍历的特点就是当前数组区间的最后一个元素就是根节点,如何找到左右子树的区间呢,从左到右遍历,找到第一个大于根节点的节点,该节点之前都是左子树,其余为右子树。 判断是否是后序遍历,只需判断从找到的右子树起点开始是否都大于根节点。 然后再对左右子树各自判断是否满足后序遍历 代
2021-09-10 09:27:33
85
原创 剑指 Offer 32 . 从上到下打印二叉树(I、II、III)
剑指 Offer 32 - I. 从上到下打印二叉树 思路 层次遍历 代码 public int[] levelOrder(TreeNode root) { if(root==null)return new int[0]; List<Integer> list=new ArrayList<>(); Queue<TreeNode> q=new LinkedList<>(); q.add(root)
2021-09-10 09:27:24
66
原创 剑指 Offer 31. 栈的压入、弹出序列
剑指 Offer 31. 栈的压入、弹出序列 思路 每次入栈后都进行检测,如果当前栈顶元素等于出栈序列的元素就弹出,循环知道不相等,最后判断栈是否为空 代码 public boolean validateStackSequences(int[] pushed, int[] popped) { Stack<Integer> st2=new Stack<>(); int j=0; for(int i=0;i<pushed.l
2021-09-10 09:27:17
62
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人