03 2021 档案

摘要:思路: 在层序遍历的基础上增加一个List,来存储当前层。 *注意在for循环里,在将现有的队列元素全部出队的同时,会循环将队列里的每一个左右节点入队。 在下一次for循环里,又会将当前层的所有元素出队,同时添加下一层的所有节点。 剑指 Offer 32 - II. 从上到下打印二叉树 II /** 阅读全文
posted @ 2021-03-31 22:35 星予 阅读(37) 评论(0) 推荐(0)
摘要:利用队列进行层序遍历。 剑指 Offer 32 - I. 从上到下打印二叉树 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right 阅读全文
posted @ 2021-03-31 22:11 星予 阅读(30) 评论(0) 推荐(0)
摘要:直接模拟就好了。 剑指 Offer 31. 栈的压入、弹出序列 class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { //泛型需要是对象类型所以不能用int Stack<Integer 阅读全文
posted @ 2021-03-31 21:57 星予 阅读(36) 评论(0) 推荐(0)
摘要:看到返回List就好奇试了一下 List<List<Integer>> res = new List<>(); 结果果然还是不行的。 这道题的思路很好 理解,先序遍历将当前节点值添加进路径。 如果符合一条路径的标准就在res存做一个答案。 遍历到null就返回到上一层,然后会有一个removeLas 阅读全文
posted @ 2021-03-31 21:42 星予 阅读(41) 评论(0) 推荐(0)
摘要:第一个if循环应该很容易看懂。 写一下为什么最后一个root节点不会一直返回,因为当某一个节点left和right都不为空,返回该节点后。 该节点的父节点肯定会有一边为空,而另一边就是上面返回的root节点。 就会执行左不为空返回右,右不为空返回左,向上返回找到的那个节点。 这种递归方法会遍历到每个 阅读全文
posted @ 2021-03-29 22:18 星予 阅读(40) 评论(0) 推荐(0)
摘要:如果一个在根节点,另一个在其子树,返回root没毛病。 如果不是同时大于或小于,因为二叉搜索树性质,会分别在两边,返回root没毛病。 如果同时在一边,则当前节点不会是最近公共祖先,往子树递归,没毛病。 *注意要写3个return 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 /** 阅读全文
posted @ 2021-03-29 21:41 星予 阅读(27) 评论(0) 推荐(0)
摘要:有一个小问题,首先用if(str == null) return 0;来判断特殊输入,这样是不行的。 后来用if(str.length() == 0)来判断,也是不行的。 因为可以有一个空字符,后面会越界。 正确的方法是在str.trim().toCharArray()后判断字符数组c的长度。 *还 阅读全文
posted @ 2021-03-29 21:27 星予 阅读(52) 评论(0) 推荐(0)
摘要:感觉没啥好总结的…… 剑指 Offer 66. 构建乘积数组 class Solution { public int[] constructArr(int[] a) { if(a.length == 0) return new int[0]; int[] b = new int [a.length] 阅读全文
posted @ 2021-03-29 20:52 星予 阅读(30) 评论(0) 推荐(0)
摘要:不知道怎么做,照搬K佬思想。 举例:a=0101 b=0111过程为: a=0101 b=0111 c= (a & b) << 1 = 1010 a^=b =0010 b=c =1010 c= (a & b) << 1 = 0100 a^=b =1000 b=c =0100 c= (a & b) < 阅读全文
posted @ 2021-03-29 19:39 星予 阅读(25) 评论(0) 推荐(0)
摘要:思路:利用逻辑符的短路性质设置递归边界。 剑指 Offer 64. 求1+2+…+n class Solution { int res = 0; public int sumNums(int n) { boolean x = n > 1 && sumNums(n-1) > 0; res += n; 阅读全文
posted @ 2021-03-27 21:48 星予 阅读(41) 评论(0) 推荐(0)
摘要:1.状态定义 dp[i]表示前i日的最大利润 2.状态转移方程 前i日最大利润=max(前(i−1)日最大利润,第i日价格−前i日最低价格) dp[i]=max(dp[i−1],prices[i]−min(prices[0:i])) 剑指 Offer 63. 股票的最大利润 class Soluti 阅读全文
posted @ 2021-03-27 21:22 星予 阅读(34) 评论(0) 推荐(0)
摘要:讲真的,现在的心情难以言表。 约瑟夫环一般是用循环链表做的,以前也写过。但是DP的做法太骚了。 1.表示状态f(n,m)=y表示:n个数,每次数m个,最后留下的数的下标为y。 2.状态转移方程 f(n,m)=(m+f(n-1,m))%n 怎么来的呢? 假设f(n-1,m)=x,即从index=0开始 阅读全文
posted @ 2021-03-27 21:05 星予 阅读(46) 评论(0) 推荐(0)
摘要:思路: 1.除了大小王,有重复的牌无法组成顺子 2.最大牌与最小牌的差 >=5,无法组成顺子 剑指 Offer 61. 扑克牌中的顺子 class Solution { public boolean isStraight(int[] nums) { Set<Integer> set = new Ha 阅读全文
posted @ 2021-03-27 19:38 星予 阅读(38) 评论(0) 推荐(0)
摘要:dp三步走: 1.表示状态 dp[i][j]表示掷i个骰子,点数之和为j的概率。 2.状态转移方程 递推公式dp[i][j]=dp[i-1][j-1]+……+dp[i-1][j-6] i个骰子和为j的概率 = i-1个骰子和为j-1 * 最后一个骰子掷出1的概率 +……+ i-1个骰子和为j-6 * 阅读全文
posted @ 2021-03-27 19:28 星予 阅读(61) 评论(0) 推荐(0)
摘要:前言 ​ 在研究java集合源码的时候,发现了一个很少用但是很有趣的点:Queue以及Deque,平常在写leetcode经常用LinkedList向上转型Deque作为栈或者队列使用,但是一直都不知道Queue的作用,于是就直接官方文档好了。 正文 概念 从上图看出,Queue以及Deque都是继 阅读全文
posted @ 2021-03-27 17:56 星予 阅读(272) 评论(0) 推荐(0)
摘要:和上一道题差不多的思想,利用辅助双端队列队首存储最值。 剑指 Offer 59 - II. 队列的最大值 class MaxQueue { Deque<Integer> A; Deque<Integer> B; public MaxQueue() { A = new LinkedList<>(); 阅读全文
posted @ 2021-03-27 17:51 星予 阅读(29) 评论(0) 推荐(0)
摘要:类似第30题的单调栈,本题用单调队列可以进行优化。 剑指 Offer 59 - I. 滑动窗口的最大值 class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length == 0 || k == 0) 阅读全文
posted @ 2021-03-27 16:58 星予 阅读(28) 评论(0) 推荐(0)
摘要:思路:使用辅助栈。 栈A实现正常的push,pop,top函数。 栈B在每次栈Apush的时候判断,栈顶元素是否>=要push进栈A的元素。 注意的点: 1. if(B.empty() || B.peek() >= x) 此处必须要>=,因为在>情况下,push(0),push(0),pop(),栈 阅读全文
posted @ 2021-03-27 15:08 星予 阅读(51) 评论(0) 推荐(0)
摘要:水一道题…… 留意substring(n)是截取下标为n到最后一个元素。 substring(0,n)是截取下标为0到下标为n-1的元素。 剑指 Offer 58 - II. 左旋转字符串 class Solution { public String reverseLeftWords(String 阅读全文
posted @ 2021-03-27 11:28 星予 阅读(22) 评论(0) 推荐(0)
摘要:思路:双指针从后往前遍历,根据第一个遇到的空格划分单词,使用StringBuilder拼接。 贴一下从后往前最后一个单词怎么拼接: 1.如果首位为字母,while(i >= 0 && s.charAt(i) != ' '),i为-1时进行拼接然后跳出大循环。 2.如果首位为空格,也类似,只是不用拼接 阅读全文
posted @ 2021-03-27 11:17 星予 阅读(33) 评论(0) 推荐(0)
摘要:依然是利用滑动窗口解决。 贴一个List的 toArray()方法 和 toArray(T[] a)方法的分析。 https://blog.csdn.net/mucaoyx/article/details/86005283 剑指 Offer 57 - II. 和为s的连续正数序列 class Sol 阅读全文
posted @ 2021-03-26 17:11 星予 阅读(27) 评论(0) 推荐(0)
摘要:比较简单,第一时间就想到了双指针对撞,但是没有想具体的证明过程。 只有冥冥中感觉这样做是对的。(没有笑哭的表情吗) 剑指 Offer 57. 和为s的两个数字 class Solution { public int[] twoSum(int[] nums, int target) { int i = 阅读全文
posted @ 2021-03-26 15:05 星予 阅读(26) 评论(0) 推荐(0)
摘要:思路:1.遍历数组,新建一个长度为32的数组统计每个数字二进制位1出现的次数。 2.然后每个元素对3取余,得到只出现一次的数字的各二进制位。 3.利用左移和或运算还原该数。 对我来说的问题在于最后一步的循环,是先赋值再移位还是先移位再赋值。 思考了一会才得出的答案。 剑指 Offer 56 - II 阅读全文
posted @ 2021-03-26 12:43 星予 阅读(40) 评论(0) 推荐(0)
摘要:新的一天开始刷题。 这道题完全没有思路,忘记了异或操作。 思路注释里写的很清晰了,注意&与&&的差别以及最后返回的写法。 补充: 提交没过,错误点在于while((m & n) == 0)写成了while((m & n) != 1) 因为两个数 按位&结果并不是非0即1,只是0和1的&运算结果非0即 阅读全文
posted @ 2021-03-26 11:31 星予 阅读(39) 评论(0) 推荐(0)
摘要:最容易想到的办法是先序遍历,从顶至底判断每个子树是不是平衡二叉树。 缺点是产生大量重复计算,代码如下。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * T 阅读全文
posted @ 2021-03-25 21:38 星予 阅读(38) 评论(0) 推荐(0)
摘要:思路:复试的时候做过这个题,后序遍历左右子树,当前节点深度为左右子树深度最大值+1。 剑指 Offer 55 - I. 二叉树的深度 /** * Definition for a binary tree node. * public class TreeNode { * int val; * Tre 阅读全文
posted @ 2021-03-25 17:19 星予 阅读(24) 评论(0) 推荐(0)
摘要:思路:二叉搜索树的中序倒序是从大到小,所以只需要在中序倒序遍历的时候计数就行了。 只是没有考虑到代码的鲁棒性。(k值问题) 剑指 Offer 54. 二叉搜索树的第k大节点 /** * Definition for a binary tree node. * public class TreeNod 阅读全文
posted @ 2021-03-25 17:08 星予 阅读(20) 评论(0) 推荐(0)
摘要:理解好二分法。 利用两次二分法,寻找左右边界,相减。 剑指 Offer 53 - I. 在排序数组中查找数字 I class Solution { public int search(int[] nums, int target) { int i = 0, j = nums.length - 1; 阅读全文
posted @ 2021-03-25 16:41 星予 阅读(18) 评论(0) 推荐(0)
摘要:A遍历到链表尾部就回到B头部继续遍历 B类似 注意三目运算符的写法。 剑指 Offer 52. 两个链表的第一个公共节点 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode 阅读全文
posted @ 2021-03-25 15:21 星予 阅读(13) 评论(0) 推荐(0)

点击右上角即可分享
微信分享提示