Skip to content

Commit c7b9be0

Browse files
committed
update-readme
1 parent 4040a94 commit c7b9be0

6 files changed

+80
-20
lines changed

README.md

+6-8
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88

99
- [从尾到头打印链表](./SwordToOffer/Doc/从尾到头打印链表.md)
1010

11-
- [重建二叉树](./SwordToOffer/Doc/重建二叉树.md)
11+
- [**重建二叉树**](./SwordToOffer/Doc/重建二叉树.md)
1212

1313
- [用两个栈实现队列](./SwordToOffer/Doc/用两个栈实现队列.md)
1414

1515
- [旋转数组的最小数字](./SwordToOffer/Doc/旋转数组的最小数字.md)
1616

1717
- [跳台阶](./SwordToOffer/Doc/跳台阶.md)
1818

19-
- [变态跳台阶](./SwordToOffer/Doc/变态跳台阶.md)
19+
- [**变态跳台阶**](./SwordToOffer/Doc/变态跳台阶.md)
2020

2121
- [***矩形覆盖***](./SwordToOffer/Doc/矩形覆盖.md)
2222

@@ -26,7 +26,7 @@
2626

2727
- [调整数组顺序使奇数位于偶数前面](./SwordToOffer/Doc/调整数组顺序使奇数位于偶数前面.md)
2828

29-
- [链表中倒数第k个节点](./SwordToOffer/Doc/链表中倒数第k个节点.md)
29+
- [链表中倒数第k**个节点**](./SwordToOffer/Doc/链表中倒数第k个节点.md)
3030

3131
- [反转链表](./SwordToOffer/Doc/反转链表.md)
3232

@@ -46,7 +46,7 @@
4646

4747
- [***二叉搜索树的后序遍历***](./SwordToOffer/Doc/二叉搜索树的后序遍历.md)
4848

49-
- [二叉树中和为某一数的路径](./SwordToOffer/Doc/二叉树中和为某一数的路径.md)
49+
- [**二叉树中和为某一数的路径**](./SwordToOffer/Doc/二叉树中和为某一数的路径.md)
5050

5151
- [***复杂链表的复制***](./SwordToOffer/Doc/复杂链表的复制.md)
5252

@@ -56,9 +56,9 @@
5656

5757
- [***数组中出现次数超过一半的数字***](./SwordToOffer/Doc/数组中出现次数超过一半的数字.md)
5858

59-
- [最小的K个数](./SwordToOffer/Doc/最小的K个数.md)
59+
- [**最小的K个数**](./SwordToOffer/Doc/最小的K个数.md)
6060

61-
- [连续子数组的最大和](./SwordToOffer/Doc/连续子数组的最大和.md)
61+
- [**连续子数组的最大和**](./SwordToOffer/Doc/连续子数组的最大和.md)
6262

6363
- [把数组排成最小的数](./SwordToOffer/Doc/把数组排成最小的数.md)
6464

@@ -68,8 +68,6 @@
6868

6969
- [第一次只出现一次的字符](./SwordToOffer/Doc/第一次只出现一次的字符.md)
7070

71-
- [数组中的逆序对](./SwordToOffer/Doc/数组中的逆序对.md)
72-
7371
- [两个链表的第一个公共节点](./SwordToOffer/Doc/两个链表的第一个公共节点.md)
7472

7573
- [数字在排序数组中出现的次数](./SwordToOffer/Doc/数字在排序数组中出现的次数.md)

SwordToOffer/Doc/二叉树中和为某一数的路径.md

+45
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,55 @@
88

99
## 解题思路
1010

11+
### 思路一
12+
1113
从根节点开始,原来的node.val是int类型的值,现在将其变为从根节点到其的路径(list类型),改变完成之后将该list求和,然后与expectNumber比较,如果相等,判断一下当前节点是否是叶子节点(通过判断其左右子树是否都为None),否则返回False,如果小于expectNumber,则继续往后面遍历,依次类推。
1214

1315
![image-20190226143959233](https://ws4.sinaimg.cn/large/006tKfTcgy1g0jtj3b5hnj31ho0gm42y.jpg)
1416

17+
### 思路二
18+
19+
采用深度遍历的思想和递归的思想。首先将根结点的值减掉。然后判断是否满足了路径条件,如果不满足就需要对左子树和右子树分别递归。
20+
需要注意的是,在每次返回上一层的时候需要通过list.remove()方法返回上一层的状态。
21+
22+
```java
23+
import java.util.ArrayList;
24+
/**
25+
public class TreeNode {
26+
int val = 0;
27+
TreeNode left = null;
28+
TreeNode right = null;
29+
30+
public TreeNode(int val) {
31+
this.val = val;
32+
}
33+
}
34+
*/
35+
public class Solution {
36+
//因为使用递归,要把实例化放到方法外面,作为成员
37+
ArrayList<ArrayList<Integer>> resultList = new ArrayList<ArrayList<Integer>>();
38+
ArrayList<Integer> list = new ArrayList<>();
39+
40+
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
41+
//因为数组长度大的放前面,使用深度优先的思想
42+
if(root == null){
43+
return resultList;
44+
}
45+
list.add(root.val);
46+
target -= root.val;
47+
if(target==0 && root.left==null && root.right==null){
48+
resultList.add(new ArrayList<Integer>(list));
49+
//因为add是添加的引用,如果不new一个出来,在后面对list的操作中会影响到resultList的内容
50+
}else{
51+
FindPath(root.left, target);
52+
FindPath(root.right, target);
53+
}
54+
list.remove(list.size()-1);
55+
return resultList;
56+
}
57+
}
58+
```
59+
1560
## 代码
1661

1762
[这里](../Code/23.py)

SwordToOffer/Doc/字符串的排列.md

+26-9
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,35 @@
99
> 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
1010
1111
## 解题思路
12-
首先,对于求没有重复的n个字符串中所有字符的所有序列,思路是固定第一个,然后求其后面所有n-1个字符串的全排列,然后将第一个字符依次与后面n-1个字符交换位置,这样就能得到所有的排列。
13-
但是,对于有重复字符的应该如何去重?可以将所有的情况都先遍历出来,然后再去遍历去重,但是这样效率太低,考虑a b b三个字符的情况:
1412

15-
固定a,求得其余两个字符的所有排列情况:bb(一种),然后将a与其交换:
13+
```
14+
字典排序算法
15+
*一个全排列可看做一个字符串,字符串可有前缀、后缀。
16+
*生成给定全排列的下一个排列.所谓一个的下一个就是这一个与下一个之间没有其他的。这就要求这一个与下一个有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。
17+
*[例]839647521是1--9的排列。1—9的排列最前面的是123456789,最后面的987654321,从右向左扫描若都是增的,就到了987654321,也就没有下一个了。否则找出第一次出现下降的位置。
18+
* 【例】 一般而言,设P是[1,n]的一个全排列。
19+
*      P=P1P2…Pn=P1P2…Pj-1PjPj+1…Pk-1PkPk+1…Pn
20+
*    find:  j=max{i|Pi<Pi+1}
21+
*         k=max{i|Pi>Pj}
22+
*      1, 对换Pj,Pk,
23+
*      2, 将Pj+1…Pk-1PjPk+1…Pn翻转
24+
* P’= P1P2…Pj-1PkPn…Pk+1PjPk-1…Pj+1即P的下一个
25+
*【例】 如何得到346987521的下一个
26+
* 1,从尾部往前找第一个P(i-1) < P(i)的位置
27+
* 3 4 6 <- 9 <- 8 <- 7 <- 5 <- 2 <- 1
28+
* 最终找到6是第一个变小的数字,记录下6的位置i-1
29+
* 2,从i位置往后找到最后一个大于6的数
30+
* 3 4 6 -> 9 -> 8 -> 7 5 2 1
31+
* 最终找到7的位置,记录位置为m
32+
* 3,交换位置i-1和m的值
33+
* 3 4 7 9 8 6 5 2 1
34+
* 4,倒序i位置后的所有数据
35+
* 3 4 7 1 2 5 6 8 9
36+
* 则347125689为346987521的下一个排列
37+
*/
38+
```
1639

17-
第一个b:bab
18-
第二个b:bba
1940

20-
- a b b
21-
- b a b
22-
23-
固定b,求得其余两个字符的所有排列情况:
2441

2542

2643
## 代码

SwordToOffer/Doc/整数中1出现的次数.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
比如12212,百位是2,那么从1到12212这些数中百位上出现1的有多少个数?
2222
应该是:100-199,1100-1199,...,11100-11199,12100-12199,总数是更高位乘以当前位数加一即(12+1)*100=1300个数
2323
### 思路二
24-
遍历所有数,然后数1出现了多少次,四算法复杂度过高,不推荐。
24+
遍历所有数,然后数1出现了多少次,算法复杂度过高,不推荐。
2525

2626

2727
## 代码

SwordToOffer/Doc/栈的压入&弹出顺序.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
例子中的流程:压入1 2 3 4,弹出4,再压入5,再弹栈:5 3 2 1
99

1010
## 解题思路
11-
对照popV,依次便利哦pushV,如果当前待压栈的数与当前可能弹栈的元素相等,则跳过该元素的压栈,否则正常压栈,调到下一个待验证的可能弹栈元素,到最后如果压入栈中的元素个数为0或者压好的栈与剩余的可能弹出栈的元素刚好是相反的则返回True,否则返回False。
11+
对照popV,依次遍历pushV,如果当前待压栈的数与当前可能弹栈的元素相等,则跳过该元素的压栈,否则正常压栈,调到下一个待验证的可能弹栈元素,到最后如果压入栈中的元素个数为0或者压好的栈与剩余的可能弹出栈的元素刚好是相反的则返回True,否则返回False。
1212

1313
## 代码
1414
```python

SwordToOffer/Doc/树的子结构.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
88
## 解题思路
99
本来的思路是采用任一一种遍历方式对两棵树同时进行遍历,然后看是否是"子串"关系,但是好像这个思路并行不通。
10-
正确思路应该是:
10+
正确思路应该是(直接看代码更清晰)
1111
算法1:
1212
先判断当前两棵树的根节点是否相同,如果相同则直接应用算法2判断pRoot2是否是pRoot1的子树,否则判断pRoot2是否是pRoot1.left的子树,如果是使用算法2,如果不是再判断pRoot2是否是pRoot1.right的子树,如果是使用算法2,如果还不是那就返回False,如果三种情况有一种满足则调用算法2并传入对应的参数。
1313

0 commit comments

Comments
 (0)