自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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 66. 构建乘积数组

剑指 Offer 66. 构建乘积数组 LeetCode-238-除自身以外数组的乘积

2021-09-13 09:22:06 69

原创 剑指 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 63. 股票的最大利润

剑指 Offer 63. 股票的最大利润 LeetCode-121-买卖股票的最佳时机

2021-09-12 10:20:08 72

原创 剑指 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&lt

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 55 - I. 二叉树的深度

剑指 Offer 55 - I. 二叉树的深度 LeetCode-104-二叉树的最大深度

2021-09-11 09:23:09 61

原创 剑指 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 57. 和为s的两个数字

剑指 Offer 57. 和为s的两个数字 LeetCode-001-两数之和

2021-09-11 09:21:55 64

原创 剑指 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 52. 两个链表的第一个公共节点

剑指 Offer 52. 两个链表的第一个公共节点 LeetCode-160-相交链表

2021-09-10 09:28:35 59

原创 剑指 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

原创 剑指 Offer 30. 包含min函数的栈

剑指 Offer 30. 包含min函数的栈 LeetCode-155-最小栈

2021-09-10 09:27:08 61

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除