auto commit

This commit is contained in:
CyC2018 2018-03-09 11:02:57 +08:00
parent d0b613b899
commit e7cc438071

View File

@ -747,7 +747,6 @@ private class Position {
} }
``` ```
### DFS ### DFS
<div align="center"> <img src="../pics//f7f7e3e5-7dd4-4173-9999-576b9e2ac0a2.png"/> </div><br> <div align="center"> <img src="../pics//f7f7e3e5-7dd4-4173-9999-576b9e2ac0a2.png"/> </div><br>
@ -1875,7 +1874,6 @@ private int rob(int[] nums, int s, int e) {
} }
``` ```
**信件错排** **信件错排**
题目描述:有 N 个 信 和 信封,它们被打乱,求错误装信的方式数量。 题目描述:有 N 个 信 和 信封,它们被打乱,求错误装信的方式数量。
@ -2199,7 +2197,7 @@ private int subsetSum(int[] nums, int targetSum) {
} }
``` ```
**01字符构成最多的字符串** **01 字符构成最多的字符串**
[Leetcode : 474. Ones and Zeroes (Medium)](https://leetcode.com/problems/ones-and-zeroes/description/) [Leetcode : 474. Ones and Zeroes (Medium)](https://leetcode.com/problems/ones-and-zeroes/description/)
@ -2242,7 +2240,7 @@ public int findMaxForm(String[] strs, int m, int n) {
题目描述:给一些面额的硬币,要求用这些硬币来组成给定面额的钱数,并且使得硬币数量最少。硬币可以重复使用。 题目描述:给一些面额的硬币,要求用这些硬币来组成给定面额的钱数,并且使得硬币数量最少。硬币可以重复使用。
这是一个完全背包问题,完全背包问题和 0-1背包问题在实现上唯一的不同是第二层循环是从 0 开始的,而不是从尾部开始。 这是一个完全背包问题,完全背包问题和 0-1 背包问题在实现上唯一的不同是,第二层循环是从 0 开始的,而不是从尾部开始。
```java ```java
public int coinChange(int[] coins, int amount) { public int coinChange(int[] coins, int amount) {
@ -2457,12 +2455,10 @@ public int minDistance(String word1, String word2) {
} }
``` ```
**修改一个字符串称为另一个字符串** // TODO **修改一个字符串称为另一个字符串** // TODO
[Leetcode : 72. Edit Distance (Hard)](https://leetcode.com/problems/edit-distance/description/) [Leetcode : 72. Edit Distance (Hard)](https://leetcode.com/problems/edit-distance/description/)
### 其它问题 ### 其它问题
**需要冷却期的股票交易** **需要冷却期的股票交易**
@ -2479,7 +2475,6 @@ s1[i] = max(s1[i - 1], s0[i - 1] - prices[i]); // Stay at s1, or buy from s0
s2[i] = s1[i - 1] + prices[i]; // Only one way from s1 s2[i] = s1[i - 1] + prices[i]; // Only one way from s1
``` ```
```java ```java
public int maxProfit(int[] prices) { public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0) return 0; if (prices == null || prices.length == 0) return 0;
@ -2499,7 +2494,6 @@ public int maxProfit(int[] prices) {
} }
``` ```
**统计从 0 \~ n 每个数的二进制表示中 1 的个数** **统计从 0 \~ n 每个数的二进制表示中 1 的个数**
[Leetcode : 338. Counting Bits (Medium)](https://leetcode.com/problems/counting-bits/description/) [Leetcode : 338. Counting Bits (Medium)](https://leetcode.com/problems/counting-bits/description/)
@ -2955,6 +2949,8 @@ public int[] productExceptSelf(int[] nums) {
**用栈实现队列** **用栈实现队列**
[Leetcode : 232. Implement Queue using Stacks (Easy)](https://leetcode.com/problems/implement-queue-using-stacks/description/)
一个栈实现: 一个栈实现:
```java ```java
@ -3134,7 +3130,7 @@ public boolean isValid(String s) {
} }
``` ```
**数组中比当前元素大的下一个数组元素的距离** **数组中元素与下一个比它大的元素之间的距离**
```html ```html
Input: [73, 74, 75, 71, 69, 72, 76, 73] Input: [73, 74, 75, 71, 69, 72, 76, 73]
@ -3143,7 +3139,7 @@ Output: [1, 1, 4, 2, 1, 1, 0, 0]
[Leetcode : 739. Daily Temperatures (Medium)](https://leetcode.com/problems/daily-temperatures/description/) [Leetcode : 739. Daily Temperatures (Medium)](https://leetcode.com/problems/daily-temperatures/description/)
使用栈来存储还未计算的元素。可以保证从栈顶向下元素递增,否则上面有一个比下面某个元素大的元素进入栈中,下面那个元素已经找到比它大的元素,因此会出栈 在遍历数组时用 Stack 把数组中的数存起来,如果当前遍历的数比栈顶元素来的大,说明栈顶元素的下一个比它大的数就是当前元素
```java ```java
public int[] dailyTemperatures(int[] temperatures) { public int[] dailyTemperatures(int[] temperatures) {
@ -3161,7 +3157,7 @@ public int[] dailyTemperatures(int[] temperatures) {
} }
``` ```
**数组中下一个比当前数大的数** **在另一个数组中比当前元素大的下一个元素**
[Leetcode : 496. Next Greater Element I (Easy)](https://leetcode.com/problems/next-greater-element-i/description/) [Leetcode : 496. Next Greater Element I (Easy)](https://leetcode.com/problems/next-greater-element-i/description/)
@ -3170,8 +3166,6 @@ Input: nums1 = [4,1,2], nums2 = [1,3,4,2].
Output: [-1,3,-1] Output: [-1,3,-1]
``` ```
在遍历数组时用 Stack 把数组中的数存起来,如果当前遍历的数比栈顶元素来的大,说明栈顶元素的下一个比它大的数就是当前元素。
```java ```java
public int[] nextGreaterElement(int[] nums1, int[] nums2) { public int[] nextGreaterElement(int[] nums1, int[] nums2) {
Map<Integer, Integer> map = new HashMap<>(); Map<Integer, Integer> map = new HashMap<>();
@ -3191,7 +3185,7 @@ public int[] nextGreaterElement(int[] nums1, int[] nums2) {
} }
``` ```
**循环数组中下一个比当前元素大的数** **循环数组中比当前元素大的下一个元素**
[Leetcode : 503. Next Greater Element II (Medium)](https://leetcode.com/problems/next-greater-element-ii/description/) [Leetcode : 503. Next Greater Element II (Medium)](https://leetcode.com/problems/next-greater-element-ii/description/)
@ -3210,7 +3204,6 @@ public int[] nextGreaterElements(int[] nums) {
} }
``` ```
## 哈希表 ## 哈希表
利用 Hash Table 可以快速查找一个元素是否存在等问题,但是需要一定的空间来存储。在优先考虑时间复杂度的情况下,可以利用 Hash Table 这种空间换取时间的做法。 利用 Hash Table 可以快速查找一个元素是否存在等问题,但是需要一定的空间来存储。在优先考虑时间复杂度的情况下,可以利用 Hash Table 这种空间换取时间的做法。
@ -3225,7 +3218,6 @@ Java 中的 **HashMap** 主要用于映射关系,从而把两个元素联系
HashMap 也可以用来对元素进行计数统计,此时键为元素,值为计数。和 HashSet 类似,如果元素有穷并且范围不大,可以用整型数组来进行统计。 HashMap 也可以用来对元素进行计数统计,此时键为元素,值为计数。和 HashSet 类似,如果元素有穷并且范围不大,可以用整型数组来进行统计。
**数组中的两个数和为给定值** **数组中的两个数和为给定值**
[Leetcode : 1. Two Sum (Easy)](https://leetcode.com/problems/two-sum/description/) [Leetcode : 1. Two Sum (Easy)](https://leetcode.com/problems/two-sum/description/)
@ -3421,7 +3413,7 @@ s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2
例如 abcd123 向右移动 3 位 得到 123abcd 例如 abcd123 向右移动 3 位 得到 123abcd
将 abcd123 中的 abcd 和 123 单独逆序,得到 dcba321然后对整个字符串进行逆序得到123abcd。 将 abcd123 中的 abcd 和 123 单独逆序,得到 dcba321然后对整个字符串进行逆序得到 123abcd。
**字符串中单词的翻转** **字符串中单词的翻转**
@ -3658,8 +3650,6 @@ public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
如果只是判断是否存在交点,那么就是另一个问题,即 编程之美3.6 的问题。有两种解法:把第一个链表的结尾连接到第二个链表的开头,看第二个链表是否存在环;或者直接比较第一个链表最后一个节点和第二个链表最后一个节点是否相同。 如果只是判断是否存在交点,那么就是另一个问题,即 编程之美3.6 的问题。有两种解法:把第一个链表的结尾连接到第二个链表的开头,看第二个链表是否存在环;或者直接比较第一个链表最后一个节点和第二个链表最后一个节点是否相同。
**链表反转** **链表反转**
[Leetcode : 206. Reverse Linked List](https://leetcode.com/problems/reverse-linked-list/description/) [Leetcode : 206. Reverse Linked List](https://leetcode.com/problems/reverse-linked-list/description/)
@ -4481,7 +4471,6 @@ private void inorder(TreeNode node, int k) {
} }
``` ```
### Trie ### Trie
<div align="center"> <img src="../pics//5c638d59-d4ae-4ba4-ad44-80bdc30f38dd.jpg"/> </div><br> <div align="center"> <img src="../pics//5c638d59-d4ae-4ba4-ad44-80bdc30f38dd.jpg"/> </div><br>
@ -4826,7 +4815,6 @@ public int singleNumber(int[] nums) {
diff &= -diff 得到出 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来。 diff &= -diff 得到出 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来。
```java ```java
public int[] singleNumber(int[] nums) { public int[] singleNumber(int[] nums) {
int diff = 0; int diff = 0;
@ -4954,4 +4942,3 @@ public int maxProduct(String[] words) {
- 何海涛, 软件工程师. 剑指 Offer: 名企面试官精讲典型编程题[M]. 电子工业出版社, 2014. - 何海涛, 软件工程师. 剑指 Offer: 名企面试官精讲典型编程题[M]. 电子工业出版社, 2014.
- 《编程之美》小组. 编程之美[M]. 电子工业出版社, 2008. - 《编程之美》小组. 编程之美[M]. 电子工业出版社, 2008.
- 左程云. 程序员代码面试指南[M]. 电子工业出版社, 2015. - 左程云. 程序员代码面试指南[M]. 电子工业出版社, 2015.