自定义博客皮肤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 94

原创 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 105

原创 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 113

原创 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 65

原创 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 47

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

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

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

原创 剑指 Offer 68 - II. 二叉树的最近公共祖先

剑指 Offer 68 - II. 二叉树的最近公共祖先思路注意,这里不是二叉搜索树了因此判断方法有点区别如果根节点为空,或者根节点等于某个节点那么直接返回根结点以左右节点去搜索如果左右都为空,直接返回null如果左为空右不空,返回右节点如果右为空左不空,返回左节点如果左右都不可,返回根节点代码 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(roo

2021-09-13 09:22:55 37

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

原创 剑指 Offer 66. 构建乘积数组

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

2021-09-13 09:22:06 45

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

原创 剑指 Offer 63. 股票的最大利润

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

2021-09-12 10:20:08 39

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

原创 剑指 Offer 61. 扑克牌中的顺子

剑指 Offer 61. 扑克牌中的顺子思路1.为了更好地检查顺子,那么就先对数组进行排序2.遍历数组,计算0(鬼牌的数量)3.遍历时,如果存在除0外相同的牌,那么直接返回false4.最后判断最后一张牌和第一张非鬼牌的差距是否小于5,在5之内说明可以用鬼牌弥补顺序代码 public boolean isStraight(int[] nums) { int j=0; Arrays.sort(nums); for(int i=0;i<

2021-09-12 10:19:35 46

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

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

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

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

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

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

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

原创 剑指 Offer 55 - I. 二叉树的深度

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

2021-09-11 09:23:09 38

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

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

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

原创 剑指 Offer 57. 和为s的两个数字

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

2021-09-11 09:21:55 40

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

原创 剑指 Offer 48. 最长不含重复字符的子字符串

剑指 Offer 48. 最长不含重复字符的子字符串LeetCode-003-无重复字符的最长子串

2021-09-11 09:21:22 39

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

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

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

原创 剑指 Offer 52. 两个链表的第一个公共节点

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

2021-09-10 09:28:35 35

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

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

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

原创 剑指 Offer 33. 二叉搜索树的后序遍历序列

剑指 Offer 33. 二叉搜索树的后序遍历序列思路参考 面试题33. 二叉搜索树的后序遍历序列(递归分治 / 单调栈,清晰图解) - 二叉搜索树的后序遍历序列 - 力扣(LeetCode) (leetcode-cn.com)后序遍历的特点就是当前数组区间的最后一个元素就是根节点,如何找到左右子树的区间呢,从左到右遍历,找到第一个大于根节点的节点,该节点之前都是左子树,其余为右子树。判断是否是后序遍历,只需判断从找到的右子树起点开始是否都大于根节点。然后再对左右子树各自判断是否满足后序遍历代

2021-09-10 09:27:33 41

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

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

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

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

2021-09-10 09:27:08 38

空空如也

空空如也

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

TA关注的人

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