
剑指Offer第二版
从第一个题开始刷起
LIMao_Link
路漫漫其修远兮,吾将上下而求索。
展开
-
剑指第二版第26题树的子结构
剑指第二版第26题树的子结构简单的思路:对于二叉树来讲,就是以前中后序三重遍历的方式为框架,明确当前节点需要做什么事情,递归结束的条件,怎样和当前节点进行比较,明确递归函数的定义,不需要拘泥于递归的细节.func isSubStructure(A *TreeNode, B *TreeNode) bool { //这里慢慢的做, if B == nil || A == nil{ return false } if A.Val == B.Val &&原创 2021-12-06 18:43:32 · 268 阅读 · 0 评论 -
剑指第二版第55题,二叉搜索树的判定
剑指offer第55题:判断一个平衡二叉树func isBalanced(root *TreeNode) bool { res := dfs(root) != -1 return res}//先写第一种方法,后序遍历 + 剪枝func dfs(root *TreeNode) int{ if root == nil{ return 0} left_tree := dfs(root.Left) if left_tree == -1{原创 2021-11-18 11:32:26 · 59 阅读 · 0 评论 -
剑指offer第54题 二叉搜索树的第k大节点
剑指offer第二版第54题二叉搜索树第k大节点比较容易出错的地方,就是这个count一定要定义,如果每次用k–来进入递归,当右边走完的时候,进去左子树的栈这个k是当前栈的这个值,右子树递归结束后,k值并没有进行相应的改变class Solution { int count; int res; public int kthLargest(TreeNode root, int k) { count = k; dfs(root); re原创 2021-11-18 10:16:17 · 89 阅读 · 0 评论 -
剑指第二版第34题 二叉树中和为某一值的路径
剑指offer第34题 二叉树中和为某一值的路径思路:在先序遍历的位置处理当前节点,减target的值,当target == 0 && root.left == null && root.right == null时,直接往里面结果集里面装就好了,分别往左边和右边递归就好了class Solution { List<List<Integer>> res; LinkedList<Integer> path; p原创 2021-11-15 10:51:03 · 203 阅读 · 0 评论 -
剑指第二版第31题
剑指 Offer 31. 栈的压入、弹出序列思路;讲道理其实刚开始我是想回溯,列举出所有的可能性,之后判断其实时候包含poped,得到最后的结果这样就显得很笨当栈不为null时,有两种选择,跳出当前栈中的数据,或者继续往里面压数,这就找到了这个题目的一个特点,我可以和和弹出数据时的poped进行进行比较,判断时继续往里面压还是往出弹完美的解决的这个题目,又是开心的一天.class Solution { public boolean validateStackSequences(int原创 2021-11-14 17:22:44 · 237 阅读 · 0 评论 -
剑指offer第33题二叉搜索树的后序遍历序列
剑指offer第33题二叉搜索树的后序遍历序列**思路:**递归的形式解题basecase : 如果左边界大于等于右边界了,return true,之上而下进行搜索,当搜索到二叉树的底部还没有结束时,说明他就是一个二叉搜 索树,必须要加,要不然会越界的应用了二叉搜索树后续遍历的特性,最后一个值为根节点,比根节点小的树为左子树,比根节点大的为右子树,找到一个比根节点大的树的时候,记录当前索引的位置,这个索引的前面就都是左子树,循环判断后续节点的值,如果有一个数值比根节点小了,返回false,不是一原创 2021-11-14 17:14:15 · 365 阅读 · 0 评论 -
剑指第二版第36题二叉搜索树转换为双向循环链表
剑指第二版第36题二叉搜索树转换为双向循环链表感悟:对于任何数据结构,基本的操作无非就是遍历+访问,具体一点就是增删改查二叉树的前中后序遍历就是对操作的顺序不同,前序的的时候,我们只知道当前节点的属性,只可以对当前节点进行操作,中序遍历,左子节点已经操作忘了,我们可以根据题目的要求找出两个节点之间的对应关系,完成题目,比如这个题目,我们就是一直在操作两个节点,pre和cur,后续遍历就是已经得到了他的左子节点和右子节点,然后根据关系求值,比如二叉树的最大路径和,二叉树的最大深度,简单的思路分析和原创 2021-11-13 11:14:31 · 440 阅读 · 0 评论 -
leetcode第1011题在D天内送达包裹的能力
leetcode第1011天 在D天内送达包裹的能力二分框架的实际应用:二分框架的最值还是用的多.class Solution { public int shipWithinDays(int[] weights, int days) { //注意这里是right 是开区间,必须额外加1 int left = 0; int right = 1; for (int i : weights) { left原创 2021-09-30 19:38:29 · 143 阅读 · 0 评论 -
剑指第二版第22题寻找链表的倒数第k个节点
剑指第二版第22题 寻找链表的倒数第k个节点真的是属于老题目了,很简单的,我写这个也完全算是复习了,但是我发现我写算法的时候开始变懒了,就是很多临界值不怎么回去考虑了,直接先写出来,最后进行测试不久完了.class Solution { public ListNode getKthFromEnd(ListNode head, int k) { //这个题目是属于老一点的题型了,但是可以在认真的写一遍 链表中的倒数第k个节点 //用双指针吧原创 2021-09-28 19:17:30 · 70 阅读 · 0 评论 -
剑指第二版第21题 调整数组顺序使得奇数位于偶数前面
剑指第21题 调整数组顺序使得奇数位于偶数的前面想法:剑指上面的题目真的就很人性化,很简单,也不会有什么难理解的地方,我这个题分别用了for循环和增强for循环,我觉得唯一可以优化的点也就是在对于数组中奇数和偶数的判断了, num & 1 == 0 这就是偶数 num & 1 != 0 说明这就是奇数 但是我不理解的一点是,为什么我是一定需要把这个东西给括住 难道是位运算的优先级比较低吗? 我真的不懂class Solution { public int[]原创 2021-09-28 19:13:55 · 70 阅读 · 0 评论 -
剑指第二版第18题删除链表的节点
剑指第二版第18题删除链表的节点class Solution { public ListNode deleteNode(ListNode head, int val) { //时间复杂度为O(N) 这个东西其实还是很简单的 if (head == null) { return null; } if (head.val == val) { return head.next;原创 2021-09-27 15:45:11 · 61 阅读 · 0 评论 -
剑指第二版第15题二进制中1的个数
剑指第二版第15题 二进制中1的个数讲道理,我到现在才知道位运算真的可以按照位数进行运算,public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { //第一种方式 向右移位 int res = 0; while(n != 0){ res += n & 1;原创 2021-09-25 18:31:58 · 62 阅读 · 0 评论 -
剑指offer第11题搜索旋转数组的最小值
剑指offer第11题搜索旋转数组的最小值我就非常非常的不明白,为什么我力扣这个题就过去了,这个题我还是想了很久很久.class Solution { public int minArray(int[] numbers) { //这个题目也是老题目了 int l = 0; int r = numbers.length - 1; while (l < r) { int mid = (l + r) / 2;原创 2021-09-23 16:22:55 · 61 阅读 · 0 评论 -
剑指第二版第10题斐波那契
剑指第二版第10题老斐波那契了,实在是有点无聊了其实我这样也是可以的,但是超时了,有点些许的可惜**第一种:**递归class Solution { public int fib(int n) { //老题目了,写的无聊了都 if (n == 0 || n == 1) { return n; } return fib(n - 1) + fib(n - 2); }}//第二中方式,clas原创 2021-09-22 20:32:54 · 54 阅读 · 0 评论 -
剑指第二版第9题用栈创造出一个队列
剑指第二版第9题用栈创造出一个队做题总结:感觉剑指上面的题的难度都还算是比较人性化的,没有什么可以刁难人的意思.class CQueue { Stack<Integer> inputStack; Stack<Integer> outputStack; int size; public CQueue() { this.size = 0; inputStack = new Stack(); out原创 2021-09-22 16:32:32 · 70 阅读 · 0 评论 -
剑指第二版第7题重建二叉树
剑指第二版第7题重建二叉树这算是一道老题目了,通过前续遍历和中序遍历创建一个二叉树,我记得还有一道反序列二叉树的题,只给了三种dfs中的一种,区别还是很大的,没有什么可以说的了,找规律就可以了.class Solution { HashMap<Integer, Integer> map = new HashMap<>(); public TreeNode buildTree(int[] preorder, int[] inorder) { //原创 2021-09-20 11:11:45 · 67 阅读 · 0 评论 -
剑指offer第6题 从尾到头打印链表
剑指offer第6题 从尾到头打印链表感觉:好像就是人家大佬说的,这种东西其实时间长了就会有一种感觉,这个题虽然是简单题,但是我发现用我自己的递归思路是可以进行的,没有看题解我就做出来了,感觉自己也确实是在慢慢的进步class Solution { ArrayList<Integer> list = new ArrayList<>(); public int[] reversePrint(ListNode head) { //这个题的思路我觉原创 2021-09-19 15:54:22 · 90 阅读 · 0 评论 -
剑指第二版第5题
剑指第二版第5题//剑指的题目其实是要比力扣的题目友好很多的,我发现有一个很神奇的东西,就是剑指offer这本书上说的这些办法真的有点笨,代码很多,时间复杂度可能也不是很好class Solution { public String replaceSpace(String s) { if (s.length() == 0) { return ""; } //为什么我感觉剑指这本书上的方法都是这么笨了,我真的就感觉有点莫名其妙原创 2021-09-19 15:29:43 · 69 阅读 · 0 评论 -
剑指第二版第四题
剑指第二版第4题第一种方式:暴力破解,整个数组全部进行遍历class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { for(int i = 0; i < matrix.length;i++){ for(int j = 0;j < matrix[i].length;j++){ if(matrix[i][j] =原创 2021-09-17 17:42:45 · 68 阅读 · 0 评论 -
剑指第二版第三题
剑指第3题自己的笨办法,双重for循环,时间复杂度为O(n的平方)class Solution { public int findRepeatNumber(int[] nums) { for (int i = 0; i < nums.length ; i++) { for (int j = i + 1; j < nums.length ; j++) { if (nums[i] == nums[j])原创 2021-09-13 11:34:00 · 86 阅读 · 0 评论