
剑指offer
qq_40396568
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 22. 链表中倒数第k个节点
思路1:遍历两次,第一次获取链表长度,第二次找出该节点时间,2O(n)class Solution { public ListNode getKthFromEnd(ListNode head, int k) { if(head==null) return null; ListNode temHead=head; int len=0; while(temHead!=null) { ..原创 2021-11-13 11:58:37 · 66 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
思路:每个节点的左右孩子节点对换,最终返回根节点即可递归重点:1、终止条件2、递归公式3、返回值代码如下:class Solution { public TreeNode mirrorTree(TreeNode root) {//根节点为null直接返回 if(root==null) { return null; }//每一次递归操作 交换左右子节点 TreeNode tem =..原创 2021-11-10 22:01:40 · 219 阅读 · 0 评论 -
JZ10 矩形覆盖
1、递归【斐波那契数列】,通过递推。【后续优化方式 记忆化递归、以及动态规划】public class Solution { public int rectCover(int target) { if(target<=0) return 0; if(target==1||target==2) return target; else return rectCo...原创 2021-09-10 12:04:08 · 64 阅读 · 0 评论 -
JZ43 左旋转字符串
思路一:左移字符挨个拼接,将源字符串截断再相加public class Solution { public String LeftRotateString(String str,int n) { if(str==null||str.length()==0) return str; StringBuffer strs = new StringBuffer(); for(int i=0;i<n;i++) ...原创 2021-09-09 16:54:43 · 82 阅读 · 0 评论 -
JZ41 和为S的连续正数序列
思路一:暴力破解,双指针刚开始想不通这个上边界是怎么出来的,sum/2。import java.util.ArrayList;public class Solution { ArrayList<ArrayList<Integer>> list = new ArrayList<>(); public ArrayList<ArrayList<Integer> > FindContinuousSequence(int...原创 2021-09-09 12:49:24 · 78 阅读 · 0 评论 -
JZ13 调整数组顺序使奇数位于偶数前面
思路一:开辟一个新数组,正向遍历数组找出所有奇数,反向遍历找出所有偶数import java.util.*;public class Solution { public int[] reOrderArray (int[] array) { int arrs[]=new int[array.length]; int j=0;//数组头开始填充奇数 for(int i=0;i<array.length;i++) { ..原创 2021-09-07 12:00:06 · 131 阅读 · 0 评论 -
JZ48 不用加减乘除做加法
思路一:自增自减运算【本质上这应该也是+ -法 num++等于num=num+1;】public class Solution { public int Add(int num1,int num2) { while(num2!=0) { num1++; num2--; } return num1; }}时间O(N)空间O(1)...原创 2021-09-05 16:12:30 · 87 阅读 · 0 评论 -
JZ30 连续子数组的最大和
思路一:双重循环【外循环控制数组头】时间N^2 空间O(1),显然不是最优解public class Solution { public int FindGreatestSumOfSubArray(int[] array) { int max=Integer.MIN_VALUE; int sum=0; for(int i=0;i<array.length;i++) { for(int j=...原创 2021-09-03 12:18:20 · 75 阅读 · 0 评论 -
JZ6 旋转数组的最小数字
一开始确实连题都看不懂思路一:遍历时间O(N),你这样没有用到题目的条件肯定不是最优解import java.util.ArrayList;public class Solution { public int minNumberInRotateArray(int [] array) { int min=Integer.MAX_VALUE; for(int i=0;i<array.length;i++) { mi..原创 2021-09-03 11:44:23 · 71 阅读 · 0 评论 -
JZ11 二进制中1的个数
这道题的前置知识:十进制如何转成二进制 无符号数与有符号数 左移右移对原数的影响问题1:商重复除2取模,模数最后倒置问题3:一般都是左右移位补0,但是负数不一样,右移补1因为第一位是符号位...原创 2021-09-02 23:30:00 · 89 阅读 · 0 评论 -
JZ45 扑克牌顺子
首先,对子不可能是顺子,只有0可以重复,最大数和最小数差值小于5思路一:排序+判断import java.util.*;public class Solution { public boolean IsContinuous(int [] numbers) { Arrays.sort(numbers); int cnt=0; for(int i=0;i<numbers.length-1;i++)//因为最多只有4个0,所以最后一个索..原创 2021-08-28 00:21:55 · 97 阅读 · 0 评论 -
JZ29 最小的K个数
思路一:排序,取前k个数import java.util.ArrayList;import java.util.*;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> list = new ArrayList<>(); if(input==nu原创 2021-08-25 21:53:31 · 72 阅读 · 0 评论 -
JZ58 对称的二叉树
二叉树的镜像这道题是每个节点的左右子树交换如果一颗二叉树同此二叉树的镜像是同样的思路一:层序遍历 【双指针:每一层进行两边往中间比较】import java.util.*;public class Solution { boolean isSymmetrical(TreeNode pRoot) { if(pRoot==null) return true; TreeNode emptyNode = new Tree...原创 2021-08-24 21:19:35 · 81 阅读 · 0 评论 -
LC 297. 二叉树的序列化与反序列化 || JZ61 序列化二叉树
人话 二叉树转成字符串,字符串能还原该二叉树官解的这种方式应该是自顶向下遍历,遍历过程记录节点另外也可以自底向上建树自底向上和自顶向下的区别和适用范围?先占坑。看看后面题有没碰到的题看了很久,题解也看了好几家,还是基础不牢,先知道怎么建树实际上题目已经提示了,剩下就是建树的过程了import java.util.*;public class Solution { String Serialize(TreeNode root) { ...原创 2021-08-22 22:06:42 · 107 阅读 · 0 评论 -
JZ23 二叉搜索树的后序遍历序列
条件:二叉搜索树&&后序遍历如果是,那么数组的左部分的值均小于根节点即数组尾节点,右半部分至倒数第二个节点大于根节点的值,这是由后序遍历二叉搜索树的性质决定的。代码如下:public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence==null||sequence.length<=0) return fal...原创 2021-08-21 20:37:21 · 117 阅读 · 0 评论 -
JZ24 二叉树中和为某一值的路径
思路一:dfs+回溯剪枝理解题意,要求路径起始为根节点,路径结尾为叶子节点,其它情况均不满足public class Solution { ArrayList<ArrayList<Integer>> list= new ArrayList<>();//总的路径 ArrayList<Integer> tempList = new ArrayList<>();//当前路径 public ArrayList<A原创 2021-08-21 16:40:49 · 72 阅读 · 0 评论 -
JZ17 树的子结构
思路一:先序遍历实际上就是树1的每个节点去和树2根节点匹配,根节点相同还得判断子树,根节点不同,那就找出树1节点中与树2根节点相同的节点,再进行子树判断代码如下:public class Solution { boolean flag=false; public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root2==null||root1==null) retur...原创 2021-08-20 12:07:54 · 95 阅读 · 0 评论 -
JZ60 把二叉树打印成多行
描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。例如:给定的二叉树是{1,2,3,#,#,4,5}该二叉树多行打印层序遍历的结果是[[1],[2,3],[4,5]]思路一:这个一看就是层序遍历(bfs)代码如下:import java.util.*;public class Solution { ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {原创 2021-08-20 10:21:11 · 148 阅读 · 0 评论 -
JZ62 二叉搜索树的第k个结点
二叉搜索树(二叉排序树)的定义:具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势。通俗的讲,就是任意某个节点的值大于左节点,小于右节点 node.right.val>node.val>node.left.val中序遍历(左根右)的遍历顺序正好满足节点值从小到大的遍历顺序递归方式,代...原创 2021-08-20 09:53:40 · 69 阅读 · 0 评论 -
LeetCode103. 二叉树的锯齿形层序遍历 || JZ59 按之字形顺序打印二叉树
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)例如:给定的二叉树是{1,2,3,#,#,4,5}该二叉树之字形层序遍历的结果是[[1],[3,2],[4,5]]思路一:层序遍历看到这个比较容易想到层序遍历,但是奇数层和偶数层是逆着来的,那么我们在将每一层的节点加入列表时,加一个判断,如果是奇数层就按照层序遍历来,如果是偶数层那就翻转一下列表代码如下:import java.util.*;public cla.原创 2021-08-19 22:45:29 · 279 阅读 · 0 评论 -
JZ39 平衡二叉树
这道题和二叉树的深度求解思路差不多,我们求深度的时候顺便求出子树深度差,大于1则标志位设为false否则就是true思路一:分治法或者说(dfs+剪枝)代码如下:public class Solution { Boolean flag=true; public boolean IsBalanced_Solution(TreeNode root) { TreeDept(root); return flag; } privat..原创 2021-08-18 10:50:18 · 59 阅读 · 0 评论 -
JZ38 二叉树的深度
思路一:层序遍历import java.util.*;public class Solution { public int TreeDepth(TreeNode root) { if(root==null) return 0; Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); int level=0; ...原创 2021-08-18 09:43:27 · 99 阅读 · 0 评论 -
JZ18 二叉树的镜像
感觉并没有用到队列或栈的什么特性,就是把每个节点的左右子树交换一下思路一:栈实现public class Solution { public TreeNode Mirror (TreeNode pRoot) { if(pRoot==null) return null; Stack<TreeNode> stack = new Stack<>(); stack.push(pRoot);原创 2021-08-17 11:59:07 · 123 阅读 · 0 评论 -
java遗忘、复习知识点
list无序 arraylist有序 需要给arraylist分配内存空间,才不会引用出错原创 2021-08-16 12:00:23 · 101 阅读 · 0 评论 -
JZ57 二叉树的下一个结点
描述:https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&&tqId=11210&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针.原创 2021-08-16 12:00:08 · 86 阅读 · 0 评论 -
NC12 重建二叉树
我们知道由前序和中序可以唯一确定一颗二叉树,做题很容易,但是演算起来就容易把自己递进去,看了5个小时,才算是明白了一点import java.util.HashMap;import java.util.Map;public class Solution { int preorder[]; Map<Integer,Integer> map = new HashMap<>(); public TreeNode reConstructB...原创 2021-08-15 17:21:52 · 93 阅读 · 0 评论 -
JZ22 从上往下打印二叉树
思路一:层序遍历也叫宽度优先遍历,通常使用队列实现队列里保存当层节点,每一次取出队列里的节点都判断其左右孩子节点,所有当层节点的子节点构成下一层节点import java.util.Queue;import java.util.LinkedList;public class Solution { public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { if(root==null)...原创 2021-08-10 16:19:09 · 82 阅读 · 0 评论 -
JZ2 替换空格
思路一:利用String类自带的方法(本题要求你自己实现一个函数,此思路不行)import java.util.*;public class Solution { public String replaceSpace (String s) { String s1=s.replaceAll(" ","%20"); return s1; }}思路二:开辟一个新的字符串空间,将原字符串的空格替换掉复制到新的字符串import...原创 2021-08-10 11:03:21 · 84 阅读 · 0 评论 -
JZ34 第一个只出现一次的字符
思路一:哈希表题中有出现多少次的字眼,不难想到用哈希表,如果用haspmap那么存储键值不能保证有序,所以取出来的第一个值为1的键值可能并不是我们要找的,这里参考了评论区的解法,不能用haspmap键值为1的字符去匹配字符串,而是以字符串字符的遍历顺序去匹配hasp表,这样就能取出第一个键值为1的字符的位置了import java.util.HashMap;public class Solution { public int FirstNotRepeatingChar(String...原创 2021-08-08 16:27:01 · 86 阅读 · 0 评论 -
JZ40 数组中只出现一次的两个数字
思路一:哈希表+排序import java.util.*;public class Solution { public int[] FindNumsAppearOnce (int[] array) { HashMap<Integer,Integer> map = new HashMap<>(); for(int i=0;i<array.length;i++) { if(map.cont...原创 2021-08-07 12:10:48 · 126 阅读 · 0 评论 -
JZ35 数组中的逆序对
一开始我以为两个数要求是相邻的,后来看了书才发现不一定是相邻的,实际上连题都没审清楚,前面一个大于后面的数字,逆序对例子中的逆序对有 1 0 ,2 0,3 0,4 0,5 0,6 0,7 0 思路一:暴力破解双循环 时间O(N^2),复杂度过高,值得注意的是,取余的操作需要在累加的过程中实现,防止累加值溢出,这也是题目为什么要求返回值取余public class Solution { public int InversePairs(int [] array...原创 2021-08-06 15:26:03 · 115 阅读 · 0 评论 -
JZ37 数字在升序数组中出现的次数
思路一:暴力破解||哈希表public class Solution { public int GetNumberOfK(int [] array , int k) { if(array==null||array.length==0) return 0; int num=0; int i=0; while(i<array.length) { if(array[i原创 2021-08-04 21:46:35 · 85 阅读 · 0 评论 -
JZ42 和为S的两个数字
思路一:双指针import java.util.ArrayList;public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { int start=0; int end=array.length-1; ArrayList list = new ArrayList(); if(arra...原创 2021-08-04 20:06:52 · 75 阅读 · 0 评论 -
JZ1 二维数组中的查找
错误定式:没看清题意,直接套之前的类似题,leetcode.78,但是该题的条件有上一行行尾小于下一行行首,因此扩展成一维数组仍然有序思路一:暴力破解,双循环一一遍历时间O(N^2)空间O(1)思路二:每一行做二分import java.util.*;public class Solution { public boolean Find(int target, int [][] array) { if(array==null || array[0].len原创 2021-08-02 20:48:24 · 59 阅读 · 0 评论 -
JZ51 构建乘积数组
怎么就不能把题意说明白点呢题意b0=a1*a2*a3....an-1,b1=a0*a1*.....an-1B数组元素为A数组元素之积不包含B当前索引相应的元素如果允许使用除法,那么就是数组之积除以当前A数组索引元素思路一:计算左右两边的积,再相乘代码实现:import java.util.ArrayList;public class Solution { public int[] multiply(int[] A) { int[] B=ne...原创 2021-08-02 19:47:22 · 75 阅读 · 0 评论 -
JZ50 数组中重复的数字
思路一:哈希表import java.util.*;public class Solution { public int duplicate (int[] numbers) { Set<Integer> set = new HashSet<>(); for(int i=0;i<numbers.length;i++) { if(!set.add(numbers[i]))//set中的元素..原创 2021-08-01 12:01:00 · 116 阅读 · 0 评论 -
JZ28 数组中出现次数超过一半的数字
思路一:数组排序,返回中间元素import java.util.Arrays;public class Solution { public int MoreThanHalfNum_Solution(int [] array) { Arrays.sort(array); return array[array.length/2]; }}时间O(nlogn) 排序消耗空间O(1)思路二:哈希表,返回表中次数(value)大于数组长度1.原创 2021-08-01 11:33:38 · 89 阅读 · 0 评论 -
JZ7 斐波那契数列
思路一:递归把握终止条件及递归公式public class Solution { public int Fibonacci(int n) { if(n==0 || n==1) return n; return Fibonacci(n-1)+Fibonacci(n-2); }}复杂度时间O(2^N-1)即2^n空间 递归栈大小 O(N)思路二:迭代public class Solution { pu...原创 2021-08-01 09:55:13 · 80 阅读 · 0 评论 -
JZ25 复杂链表的复制
https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&&tqId=11178&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking题意:复制出与原链表相同的链表,但不要引用原链表的节点思路一:哈希表1、建立与原链表节点相同值的新节点,此时新链表未成链2、将原链表节点的原创 2021-07-31 15:24:24 · 73 阅读 · 0 评论 -
JZ56 删除链表中重复的结点(较难)
要求重复的节点一个不保留,题型相似思路一:头结点,双指针,一个指针指向当前不重复的节点,一个指针作为工作指针,找到当前重复值的最后一个重复值,重点是理解相邻节点值不相等,不代表可以入链,因为该节点可能也是个重复值节点代码实现:public class Solution { public ListNode deleteDuplication(ListNode pHead) { if(pHead==null || pHead.next==null) ...原创 2021-07-31 12:03:12 · 86 阅读 · 0 评论