![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer66题
Juliussss
这个作者很懒,什么都没留下…
展开
-
66、机器人的运动范围
使用递归,做法和65题的找路径基本一致public class Solution { public int movingCount(int threshold, int rows, int cols) { boolean[] isvisted=new boolean[rows*cols]; for(boolean v:isvisted){ ...原创 2019-06-03 09:58:51 · 95 阅读 · 0 评论 -
20、包含min函数的栈
有两种方法读到min,一个是push和pop的时候更新min,另一个是调用min的时候才遍历栈。两种方法各有优缺点。import java.util.Stack;public class Solution { Stack<Integer> stack=new Stack<Integer>(); int min=Integer.MAX_VALUE;...原创 2019-05-29 14:33:02 · 78 阅读 · 0 评论 -
19、顺时针打印矩阵
定义行的起始和终止并定义列的起始和终止,然后转圈圈~注意每次循环的后两步要加判断,否则会多打印import java.util.ArrayList;public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { ArrayList<Integer&...原创 2019-05-29 14:07:32 · 78 阅读 · 0 评论 -
18、二叉树的镜像
分析一下镜像的过程,即交换左右子树,也就是Mirror(root.left)和Mirror(root.right)。然后写出交换规则和终止条件即可。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int ...原创 2019-05-29 11:47:45 · 90 阅读 · 0 评论 -
17、树的子结构
犯过的错误:在最后一行的return时候,除了左子树与左子树,右子树与右子树还多加了个根与根,实际上这个递归函数就是从根开始判断的,多加会导致程序一直在root上比较而达不到终止条件。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; pu...原创 2019-05-29 11:32:32 · 79 阅读 · 0 评论 -
52、正则表达式匹配
理清规则然后将规则写入递归即可:核心:将题目分解为第二个字符是不是'*'这两种情况。终止条件:1、str和pattern都同时遍历到最后,返回true。2、str遍历还没结束,pattern就已经遍历完,返回false不同情形:1、如果pattern的下一个字符是'*',有两种大情况,一种是str当前字符不等于pattern字符,一种是等于(pattern字符为'.'的时候也相当于等于...原创 2019-06-02 10:18:52 · 119 阅读 · 0 评论 -
51、构建乘积数组
要尽量减少乘法的次数,画一个二维矩阵然后就可以发现规律,将不能加入乘法的那个数当作1,然后连成一条线,就会发现数组左边和右边分别是三角形,每一行都只需要将前一行或者后一行乘以一个数即可。遍历两个三角形,将每一行的值存到数组,然后再遍历两个数组,就可以得出最后乘积数组啦import java.util.ArrayList;public class Solution { publi...原创 2019-06-02 10:18:41 · 81 阅读 · 0 评论 -
16、合并两个链表
出过的错误:使用l.next=list1;的时候忘记加一句l=l.next;导致一直只有一个结点。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution...原创 2019-05-29 10:33:15 · 88 阅读 · 0 评论 -
15、翻转链表
定义前中后三个指针,从前往后遍历一遍即可。出过的错误,在指针的尾部处理部分要注意会不会到达一个空的值。还有一个靠后的指针,如果这个靠后指针为空了就不应该继续调用next了。最后要返回哪个指针也不能弄错了。/*public class ListNode { int val; ListNode next = null; ListNode(int val) ...原创 2019-05-29 10:01:38 · 62 阅读 · 0 评论 -
14、 链表中倒数第k个结点
先计算链表长度,然后根据长度减去k即可知道第几个结点是倒数第k个结点。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public Li...原创 2019-05-29 09:39:36 · 85 阅读 · 0 评论 -
13 调整数组顺序使奇数位于偶数前面
创建两个列表,一个存放奇数一个存放偶数,然后吧两个列表中的数放入数组即可。import java.util.*;public class Solution { public void reOrderArray(int [] array) { ArrayList<Integer> lst=new ArrayList<>(); A...原创 2019-05-29 09:27:41 · 73 阅读 · 0 评论 -
12、数值的整数次方
可以用减少乘法次数的策略,一个整数要么奇数要么偶数,对于奇数来说就是2的倍数加一,偶数是2的倍数,而一个数不停的平方就相当于次方数乘2。所以可以根据这个规律来减少乘法的次数。public class Solution { public double Power(double base, int exponent) { int n=Math.abs(exponent);...原创 2019-05-29 09:17:45 · 77 阅读 · 0 评论 -
11、二进制中1的个数
如果n是负数,那么可以用一个lang类型来存储n转为补码后的正数大小。然后做一个for循环,分别和2的0~31次方按位与。只要结果不是0,那么count++public class Solution { public int NumberOf1(int n) { if(n<0){ long t=Integer.MAX_VALUE-n+1;...原创 2019-05-29 00:02:57 · 87 阅读 · 0 评论 -
10、矩形覆盖
还是斐波那契public class Solution { public int RectCover(int target) { if(target==1||target==2) return target; int f1=1; int f2=2; int f=0; for(int...原创 2019-05-28 23:21:01 · 72 阅读 · 0 评论 -
9、变态跳台阶
根据数学推导,最后结果应该是2^(n-1),但是在Java中用pow计算整型比较复杂,需要来回转换格式,故采用位运算。即1<<n-1public class Solution { public int JumpFloorII(int target) { if(target==0) return 0; return 1...原创 2019-05-28 23:12:58 · 73 阅读 · 0 评论 -
53、表示数值的字符串
设置两个参分别表示是否出现过E/e和是否出现过'.',然后遍历一遍数组:当遇到e/E:如果之前出现过e/E,返回false,如果e/E是出现在数组最后一个位置,返回false当遇到'+','-':如果这个符号不是第一个位置,而且前面一个字符不是e,那么就返回false,如果字符出现在最后一个位置,返回false当遇到'.':如果这个符号出现之前出现过e/E,或者之前还出现过'.',或者...原创 2019-06-02 10:19:06 · 85 阅读 · 0 评论 -
54、字符流中第一个不重复的字符
由于ascii码的范围是0~127,定义一个大小为128的数组,每出现一个字符,数组中字符对应的下标的位置将数值加一。然后取的时候,遍历list,看哪个对应的数组中的值为1即可,没有则返回‘#’import java.util.*;public class Solution { //Insert one char from stringstream int []a=ne...原创 2019-06-02 10:19:19 · 89 阅读 · 0 评论 -
55、链表中环的入口结点
定义一个快指针一个慢指针。如果两个指针能相遇,那么就代表有环。然后让慢指针继续往下走,快指针回到链表头部,一次走一步,然后两个指针相遇的地方就是环的入口。/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; ...原创 2019-06-02 10:19:32 · 87 阅读 · 0 评论 -
65、矩阵中的路径
写一个递归函数即可。因为规定不能走已经走过的路,所以定义一个rows*cols大小的boolean数组,用来表示当前结点是否已经走过。在遍历过程中还要用到回溯,因为如果一条路没走下去,那么这条路就要把状态更新为没走过。递归的终止条件:row<0,col<0,row>=rows,col>=cols,isvisted[row*cols+col]==true,str[len]...原创 2019-06-03 09:58:39 · 89 阅读 · 0 评论 -
64、滑动窗口的最大值
方法一:暴力解法,遍历即可import java.util.*;public class Solution { public ArrayList<Integer> maxInWindows(int [] num, int size) { ArrayList<Integer> list=new ArrayList<Integer&...原创 2019-06-03 09:58:28 · 350 阅读 · 0 评论 -
63、数据流的中位数
用一个列表存放数据并读取即可import java.util.*;public class Solution { ArrayList<Double> list=new ArrayList<>(); public void Insert(Integer num) { list.add((double)num); } pu...原创 2019-06-03 09:58:16 · 113 阅读 · 0 评论 -
62、二叉搜索树的第k个结点
方法一:二叉搜索树的中序遍历为递增的,所以进行一遍中序遍历将结点放入列表中,然后找到列表的第k个值即可。/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val...原创 2019-06-03 09:58:02 · 84 阅读 · 0 评论 -
61、序列化二叉树
采用先序遍历序列化,然后先序遍历解序列化。序列化的时候每个结点值后面都要加一个"!"用来分隔。如果遇到空结点那就加"#"表示。import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeN...原创 2019-06-03 09:57:45 · 85 阅读 · 0 评论 -
60、把二叉树打印成多行
定义一个队列queue和一个last指针以及nLast指针,先将根节点push到queue中,从队列中pop出一个节点然后将节点的左孩子和右孩子分别push到queue中。nLast一直是跟随着最近一个被push的结点。当last等于刚pop出的结点时,向二维列表中添加一次数据并让last=nLast。循环执行,直到队列为空。import java.util.ArrayList;impor...原创 2019-06-03 09:57:31 · 76 阅读 · 0 评论 -
59、按之字形顺序打印二叉树
定义两个栈stk1和stk2。先讲根结点push到stk1中,然后做循环while,当stk1不为空,从stk1中pop结点并将结点左孩子和有孩子依次push到stk2中。然后另一个while做循环,stk2不为空,从stk2中pop出结点并将结点到右孩子和左孩子依次放入栈中。大循环终止条件是stk1和stk2都为空。心得:一般要改变顺序的题,基本都要考虑一下栈。import java....原创 2019-06-02 12:51:37 · 86 阅读 · 0 评论 -
58、对称的二叉树
思想就是判断左右子树的值是否相等,递归判断左子树的右子树对比右子树的左子树,左子树的左子树对比右子树的右子树。如果两边同时递归到了空的值,就返回true。如果只有一边到了空,就返回false。/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; ...原创 2019-06-02 12:09:59 · 73 阅读 · 0 评论 -
57、二叉树的下一个结点
方法一:通过不停的使用next指针找到这棵树的根节点。然后利用中序遍历,将遍历结果放入一个ArrayList,然后找到这个pNode的位置,即可返回下一个结点/*public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkN...原创 2019-06-02 11:38:41 · 124 阅读 · 0 评论 -
56、删除链表中重复结点
定义两个指针,一个是当前指针cur,一个是下一个结点指针t,每次先遍历t,遇到重复的值要跳过,然后让cur的next为t,cur再变成cur.next。最后还要让指针指向空,这样才是一个完整去重链表。/* public class ListNode { int val; ListNode next = null; ListNode(int val) { ...原创 2019-06-02 10:22:24 · 78 阅读 · 0 评论 -
24、二叉树中和为某一值的路径
使用递归分别递归左右子树,终止条件分别是遍历到空和遍历到叶子结点。需要注意的点:用来存放val的数组不能同时传入左右子树的遍历,这样会导致数值过多。import java.util.ArrayList;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = n...原创 2019-05-30 13:11:58 · 98 阅读 · 0 评论 -
23、二叉搜索树的后序遍历
二叉搜索树有其规律,中序遍历是一个递增数组,因此后续遍历也有了规律,那就是左子树一定比根节点小,右子树一定比根节点大,而后续遍历最后一个结点必定是根节点。后续遍历是左->右->根的顺序遍历,所以按照规则来说,在后续遍历数组中,从第一个大于根节点的数开始,剩下的数都应该大于根结点。如果违背这个规律说明这个数组不是一个二叉搜索树的后序遍历结果,返回false。然后用递归的思想分别对左右子树...原创 2019-05-30 13:11:47 · 207 阅读 · 0 评论 -
22、从上往下打印二叉树
左程云课里讲的,定义一个last 和一个nLast。算法分三步,首先弹出队列中第一个元素(将弹出的元素的值放入列表),然后将元素的左右子树添加到队列中,然后判断last是不是等于刚弹出的结点,如果是就让last=nLast。注意点:Java中Queue是一个抽象的接口,不可以被实例化。import java.util.ArrayList;import java.util.Queue;...原创 2019-05-30 13:11:35 · 88 阅读 · 0 评论 -
21、栈的押入弹出序列
做了两种解法:(本题还有一个注意点,根据数值获取下标的时候不能使用Arrays.binarySearch()方法。因为这个方法只对有序数组有效。)解法1:数学推导。找到popA中第一个数字在pushA中的位置index。index之前的几个数字在popA中的出现顺序必须与原来相反。import java.util.ArrayList;import java.util.Arrays;i...原创 2019-05-30 13:11:24 · 111 阅读 · 0 评论 -
8、跳台阶
同斐波那契一样public class Solution { public int JumpFloor(int target) { if(target==1||target==2){ return target; } int f1=1; int f2=2; int f=0; ...原创 2019-05-28 23:05:14 · 74 阅读 · 0 评论 -
7、斐波那契数列
非递归,数学表示即可public class Solution { public int Fibonacci(int n) { if(n==1||n==2){ return 1; } int f1=1; int f2=1; int f=0; for(int i=2;...原创 2019-05-28 22:58:37 · 210 阅读 · 0 评论 -
3、从尾到头打印链表
使用一个栈,遍历一遍链表将链表的值push到栈里面,然后将栈的值pop到列表里面。/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* ...原创 2019-05-28 14:48:15 · 64 阅读 · 0 评论 -
2、替换空格
新建一个StringBuilder(毕竟StringBuilder比StringBuffer速度快,刷算法题一般都用StringBuilder),遍历str,遇到空格就往StringBuffer里面添加‘%’,‘2’,‘0’三个字符。否则添加str中遍历到的那个字符。public class Solution { public String replaceSpace(StringBu...原创 2019-05-28 14:40:06 · 69 阅读 · 0 评论 -
36、两个链表的第一个公共结点
因为两个链表不一定等长,所以先求出两个链表的长度。然后求差x,较长的链表先走x部,然后开始比较两个链表,当遇到相同的结点则返回,一直未遇到则返回null/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }...原创 2019-05-31 10:38:49 · 86 阅读 · 0 评论 -
35、数组中的逆序对
就是归并排序,只是在排序过程中加入countpublic class Solution { public int InversePairs(int [] array) { if(array.length==0){ return 0; } int count=0; int[] temp=new in...原创 2019-05-31 10:29:10 · 102 阅读 · 0 评论 -
30、连续子数组的最大和
思路:定一一个下标索引,当sum和目前遍历到的数想加大于0,就加上这个数。如果小于0,就让sum等于这个数的下一个数。遍历期间一直更新maxpublic class Solution { public int FindGreatestSumOfSubArray(int[] array) { int start=0; int max=Integer.MI...原创 2019-05-31 10:26:13 · 79 阅读 · 0 评论 -
31、整数中1出现的次数
“对于整数n,我们将这个整数分为三部分:当前位数字cur,更高位数字high,更低位数字low,如:对于n=21034,当位数是十位时,cur=3,high=210,low=4。 我们从个位到最高位 依次计算每个位置出现1的次数: 1)当前位的数字等于0时,例如n=21034,在百位上的数字cur=0,百位上是1的情况有:00100~00199,01100~01199,……,201...原创 2019-05-31 10:26:34 · 135 阅读 · 0 评论