auto commit

This commit is contained in:
CyC2018 2018-03-27 14:56:55 +08:00
parent 3789494d8c
commit abed3417aa

View File

@ -30,8 +30,7 @@
* [25. 合并两个排序的链表](#25-合并两个排序的链表)
* [26. 树的子结构](#26-树的子结构)
* [27. 二叉树的镜像](#27-二叉树的镜像)
* [28.1 对称的二叉树](#281-对称的二叉树)
* [28.2 平衡二叉树](#282-平衡二叉树)
* [28 对称的二叉树](#28-对称的二叉树)
* [29. 顺时针打印矩阵](#29-顺时针打印矩阵)
* [30. 包含 min 函数的栈](#30-包含-min-函数的栈)
* [31. 栈的压入、弹出序列](#31-栈的压入弹出序列)
@ -61,7 +60,8 @@
* [52. 两个链表的第一个公共结点](#52-两个链表的第一个公共结点)
* [53 数字在排序数组中出现的次数](#53-数字在排序数组中出现的次数)
* [54. 二叉搜索树的第 K 个结点](#54-二叉搜索树的第-k-个结点)
* [55 二叉树的深度](#55-二叉树的深度)
* [55.1 二叉树的深度](#551-二叉树的深度)
* [55.2 平衡二叉树](#552-平衡二叉树)
* [56. 数组中只出现一次的数字](#56-数组中只出现一次的数字)
* [57.1 和为 S 的两个数字](#571-和为-s-的两个数字)
* [57.2 和为 S 的连续正数序列](#572-和为-s-的连续正数序列)
@ -544,7 +544,7 @@ private int minNumberInRotateArray(int[] nums, int first, int last) {
}
```
### 双指针
### 二分查找
复杂度O(log<sub>n</sub>) + O(1)
@ -556,7 +556,7 @@ public int minNumberInRotateArray(int[] nums) {
if (h - l == 1) return nums[h];
int mid = l + (h - l) / 2;
if (nums[mid] >= nums[l]) l = mid;
else if (nums[mid] <= nums[h]) h = mid;
else h = mid;
}
return nums[l];
}
@ -694,7 +694,7 @@ public int maxProductAfterCutting(int n) {
### 贪心解法
尽可能多剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现,如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长度为 2 的绳子。
尽可能多剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现,如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长度为 2 的绳子。
证明:当 n >= 5 时3(n - 3) - 2(n - 2) = n - 5 >= 0。因此把长度大于 5 的绳子切成两段,令其中一段长度为 3 可以使得两段的乘积最大。
@ -726,7 +726,7 @@ public int NumberOf1(int n) {
### n&(n-1)
O(logM) 时间复杂度解法,其中 m 表示 1 的个数。
O(logM) 时间复杂度解法,其中 M 表示 1 的个数。
该位运算是去除 n 的位级表示中最低的那一位。
@ -772,7 +772,7 @@ public double Power(double base, int exponent) {
}
double pow = Power(base * base, exponent / 2);
if (exponent % 2 != 0) pow = pow * base;
return isNegative ? 1 / pow : pow;
return isNegative ? (1 / pow) : pow;
}
```
@ -805,6 +805,13 @@ private void print1ToMaxOfNDigits(char[] number, int digit) {
print1ToMaxOfNDigits(number, digit + 1);
}
}
private void printNumber(char[] number) {
int index = 0;
while (index < number.length && number[index] == '0') index++;
while (index < number.length) System.out.print(number[index++]);
System.out.println();
}
```
# 18.1 在 O(1) 时间内删除链表节点
@ -871,7 +878,7 @@ public ListNode deleteDuplication(ListNode pHead) {
## 解题思路
应该注意到,'.' 是用来代替一个任意字符,而 '\*' 是用来重复前面的字符。这两个的作用不同,不能把 '.' 的作用和 '\*' 进行类比,从而它当成重复前面字符一次。
应该注意到,'.' 是用来代替一个任意字符,而 '\*' 是用来重复前面的字符。这两个的作用不同,不能把 '.' 的作用和 '\*' 进行类比,从而它当成重复前面字符一次。
```html
p.charAt(j) == s.charAt(i) : dp[i][j] = dp[i-1][j-1];
@ -1147,7 +1154,7 @@ private void swap(TreeNode root) {
}
```
# 28.1 对称的二叉树
# 28 对称的二叉树
## 题目描述
@ -1175,39 +1182,6 @@ boolean isSymmetrical(TreeNode t1, TreeNode t2) {
}
```
# 28.2 平衡二叉树
## 题目描述
```html
3
/ \
9 20
/ \
15 7
```
平衡二叉树左右子树高度差不超过 1。
## 解题思路
```java
private boolean isBalanced = true;
public boolean IsBalanced_Solution(TreeNode root) {
height(root);
return isBalanced;
}
private int height(TreeNode root) {
if (root == null) return 0;
int left = height(root.left);
int right = height(root.right);
if (Math.abs(left - right) > 1) isBalanced = false;
return 1 + Math.max(left, right);
}
```
# 29. 顺时针打印矩阵
## 题目描述
@ -2200,7 +2174,13 @@ private void inOrder(TreeNode root, int k) {
}
```
# 55 二叉树的深度
# 55.1 二叉树的深度
## 题目描述
从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
## 解题思路
```java
public int TreeDepth(TreeNode root) {
@ -2209,6 +2189,40 @@ public int TreeDepth(TreeNode root) {
}
```
# 55.2 平衡二叉树
## 题目描述
```html
3
/ \
9 20
/ \
15 7
```
平衡二叉树左右子树高度差不超过 1。
## 解题思路
```java
private boolean isBalanced = true;
public boolean IsBalanced_Solution(TreeNode root) {
height(root);
return isBalanced;
}
private int height(TreeNode root) {
if (root == null) return 0;
int left = height(root.left);
int right = height(root.right);
if (Math.abs(left - right) > 1) isBalanced = false;
return 1 + Math.max(left, right);
}
```
# 56. 数组中只出现一次的数字
## 题目描述