Skip to content

Commit 940f76f

Browse files
committed
h
1 parent 7fc473e commit 940f76f

28 files changed

+1542
-222
lines changed

Java/Frog Jump.java

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
H
2+
1533535937
3+
tags: DP, Hash Table
4+
5+
Frog jump 的题目稍微需要理解: 每个格子可以 jump k-1, k, k+1 steps, 而k取决于上一步所跳的步数. 默认 0->1 一定是跳了1步.
6+
7+
注意: int[] stones 里面是stone所在的unit (不是可以跳的步数, 不要理解错).
8+
9+
#### DP
10+
- 原本想按照corrdiante dp 来做, 但是发现很多问题, 需要track 不同的 possible previous starting spot.
11+
- 根据jiuzhang答案: 按照定义, 用一个 map of <stone, Set<possible # steps to reach stone>>
12+
- 每次在处理一个stone的时候, 都根据他自己的 set of <previous steps>, 来走下三步: k-1, k, or k+1 steps.
13+
- 每次走一步, 查看 stone + step 是否存在; 如果存在, 就加进 next position: `stone+step` hash set 里面
14+
15+
##### 注意init
16+
- `dp.put(stone, new HashSet<>())` mark 每个stone的存在
17+
- `dp.get(0).add(0)` init condition, 用来做 dp.put(1, 1)
18+
19+
##### 思想
20+
- 最终做下来思考模式, 更像是BFS的模式: starting from (0,0), add all possible ways
21+
- 然后again, try next stone with all possible future ways ... etc
22+
23+
```
24+
25+
/*
26+
A frog is crossing a river. The river is divided into x units and at each unit
27+
there may or may not exist a stone. The frog can jump on a stone, but it must not jump into the water.
28+
29+
Given a list of stones' positions (in units) in sorted ascending order,
30+
determine if the frog is able to cross the river by landing on the last stone.
31+
Initially, the frog is on the first stone and assume the first jump must be 1 unit.
32+
33+
If the frog's last jump was k units, then its next jump must be either k - 1, k, or k + 1 units.
34+
Note that the frog can only jump in the forward direction.
35+
36+
Note:
37+
38+
The number of stones is ≥ 2 and is < 1,100.
39+
Each stone's position will be a non-negative integer < 231.
40+
The first stone's position is always 0.
41+
Example 1:
42+
43+
[0,1,3,5,6,8,12,17]
44+
45+
There are a total of 8 stones.
46+
The first stone at the 0th unit, second stone at the 1st unit,
47+
third stone at the 3rd unit, and so on...
48+
The last stone at the 17th unit.
49+
50+
Return true. The frog can jump to the last stone by jumping
51+
1 unit to the 2nd stone, then 2 units to the 3rd stone, then
52+
2 units to the 4th stone, then 3 units to the 6th stone,
53+
4 units to the 7th stone, and 5 units to the 8th stone.
54+
Example 2:
55+
56+
[0,1,2,3,4,8,9,11]
57+
58+
Return false. There is no way to jump to the last stone as
59+
the gap between the 5th and 6th stone is too large.
60+
*/
61+
62+
// simplified with helper function
63+
class Solution {
64+
public boolean canCross(int[] stones) {
65+
if (stones == null || stones.length == 0) return false;
66+
Map<Integer, Set<Integer>> dp = new HashMap<>();
67+
// Init: all stone slots has nothing on them
68+
for (int stone : stones) {
69+
dp.put(stone, new HashSet<>());
70+
}
71+
dp.get(0).add(0); // such that dp.get(0) will move (dp, 0-stone, 1-step) on index 0
72+
for (int stone : stones) {
73+
for (int k : dp.get(stone)) {
74+
move(dp, stone, k);
75+
move(dp, stone, k + 1);
76+
move(dp, stone, k - 1);
77+
}
78+
}
79+
int lastStone = stones[stones.length - 1];
80+
return !dp.get(lastStone).isEmpty(); // able to reach
81+
}
82+
83+
private void move(Map<Integer, Set<Integer>> dp, int stone, int step) {
84+
if (step > 0 && dp.containsKey(stone + step)) {
85+
dp.get(stone + step).add(step);
86+
}
87+
}
88+
}
89+
90+
// original
91+
class Solution {
92+
public boolean canCross(int[] stones) {
93+
if (stones == null || stones.length == 0) return false;
94+
int n = stones.length;
95+
Map<Integer, Set<Integer>> dp = new HashMap<>();
96+
for (int stone : stones) {
97+
dp.put(stone, new HashSet<>());
98+
}
99+
dp.get(0).add(0);
100+
for (int stone : stones) {
101+
for (int k : dp.get(stone)) {
102+
if (k - 1 > 0 && dp.containsKey(stone + k - 1)) { // k - 1
103+
dp.get(stone + k - 1).add(k - 1);
104+
}
105+
if (k > 0 && dp.containsKey(stone + k)) {// k
106+
dp.get(stone + k).add(k);
107+
}
108+
if (k + 1 > 0 && dp.containsKey(stone + k + 1)) { // k + 1
109+
dp.get(stone + k + 1).add(k + 1);
110+
}
111+
}
112+
}
113+
int lastStone = stones[n - 1];
114+
return !dp.get(lastStone).isEmpty(); // able to reach
115+
}
116+
}
117+
```
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
H
2+
1533538848
3+
tags: Hash Table, Two Pointers, String, Sliding Window
4+
5+
如题.
6+
7+
#### Two Pointer + HashMap
8+
- 原本想用 DP, 但是其实用 sliding window 的思想
9+
- sliding window 的切割: 用hashmap last occurrance of char index;
10+
- map.remove(c) 之后, 就等于彻底切掉了那一段; 那么 map.get(c) + 1 也就是新的 left window border
11+
12+
```
13+
/*
14+
Given a string s , find the length of the longest substring t that contains at most 2 distinct characters.
15+
16+
Example 1:
17+
18+
Input: "eceba"
19+
Output: 3
20+
Explanation: t is "ece" which its length is 3.
21+
Example 2:
22+
23+
Input: "ccaabbb"
24+
Output: 5
25+
Explanation: t is "aabbb" which its length is 5.
26+
27+
*/
28+
29+
/*
30+
Map<Character, Integer> to map last occurrance of certain character.
31+
if map.size() > 2, we'll remove trop off left-most char
32+
maintain max based on curr right - left
33+
*/
34+
class Solution {
35+
public int lengthOfLongestSubstringTwoDistinct(String s) {
36+
if (s == null || s.length() == 0) return 0;
37+
int n = s.length();
38+
Map<Character, Integer> lastOccurMap = new HashMap<>();
39+
int left = 0, right = 0, max = 0;
40+
41+
while (right < n) {
42+
if (lastOccurMap.size() <= 2) { // add new char
43+
lastOccurMap.put(s.charAt(right), right++);
44+
}
45+
if (lastOccurMap.size() > 2) { // clean up left-most char
46+
int leftMost = right;
47+
for (int index : lastOccurMap.values()) {
48+
leftMost = Math.min(leftMost, index);
49+
}
50+
lastOccurMap.remove(s.charAt(leftMost));
51+
left = leftMost + 1;
52+
}
53+
max = Math.max(max, right - left);
54+
}
55+
56+
return max;
57+
}
58+
}
59+
```

Java/Moving Average from Data Stream.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
E
22
1533510925
3-
tags:Design, Queue
3+
tags:Design, Queue, Sliding Window
44

55
给一个interface, design一个structure, 能够计算moving window average.
66

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
H
2+
1533532566
3+
tags: String, Enumeration
4+
5+
Read N Character using `Read4(char[] buf)` 的加强版: 可以不断读 read(buf, n)
6+
7+
#### String
8+
- 注意String的index handle, 慢慢写edge case
9+
- 理解题目意思: `read4(char[] buf)` 这样的 `populate input object` 的function稍微少一点.
10+
- 遇到时候, 仔细理解function用法, 不要慌乱. 其实思考方式很简单, 仔细handle string 还有 edge case就好了.
11+
12+
```
13+
/*
14+
The API: int read4(char *buf) reads 4 characters at a time from a file.
15+
16+
The return value is the actual number of characters read. For example,
17+
it returns 3 if there is only 3 characters left in the file.
18+
19+
By using the read4 API, implement the function int read(char *buf, int n)
20+
that reads n characters from the file.
21+
22+
Note:
23+
The read function may be called multiple times.
24+
25+
Example 1:
26+
27+
Given buf = "abc"
28+
read("abc", 1) // returns "a"
29+
read("abc", 2); // returns "bc"
30+
read("abc", 1); // returns ""
31+
Example 2:
32+
33+
Given buf = "abc"
34+
read("abc", 4) // returns "abc"
35+
read("abc", 1); // returns ""
36+
37+
*/
38+
39+
/* The read4 API is defined in the parent class Reader4.
40+
int read4(char[] buf); */
41+
42+
/*
43+
Cache results from read4(char*); only read again if not enough;
44+
Cache the read cacheIndex of read4 result;
45+
If read4 returns 0, just return ""; maybe have global variable to mark end.
46+
*/
47+
public class Solution extends Reader4 {
48+
/**
49+
* @param buf Destination buffer
50+
* @param n Maximum number of characters to read
51+
* @return The number of characters read
52+
*/
53+
private char[] cache = new char[4];
54+
private int cacheIndex = 0;
55+
private int count = 0;
56+
//private int index = 0;
57+
private boolean isEnd = false;
58+
public int read(char[] buf, int n) {
59+
if (buf == null || n <= 0 || isEnd) return 0; // if read4 is ended, return 0;
60+
61+
// decrease n for existing read4 content
62+
int i = 0; // current iteration
63+
while (cacheIndex > 0 && cacheIndex < count && i < n) {
64+
buf[i++] = cache[cacheIndex++];
65+
}
66+
// read while using while loop until n is exhausted
67+
while (i < n) {
68+
cache = new char[4];
69+
count = read4(cache);
70+
int range = i + 3 < n ? count : Math.min(n - i, count);
71+
System.arraycopy(cache, 0, buf, i, range);
72+
i += range;
73+
if (range < 4) cacheIndex = range;
74+
if (count < 4 && range == count) isEnd = true;
75+
if (count < 4) break;
76+
}
77+
return i;
78+
}
79+
}
80+
```

Java/Read N Characters Given Read4.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
E
22
1533408053
3-
tags: String
3+
tags: String, Enumeration
44

55
Read4 题目. 理解题目: 是有个input object buff, 会被populated with data.
66

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
H
2+
1533539906
3+
tags: BFS
4+
5+
给Walls and Gates很像, 不同的是, 这道题要选一个 coordinate, having shortest sum distance to all buildings (marked as 1).
6+
7+
#### BFS
8+
- BFS 可以 mark shortest distance from bulding -> any possible spot.
9+
- Try each building (marked as 1) -> BFS cover all 0.
10+
- time: O(n^2) * # of building; use new visited[][] to mark visited for each building.
11+
- O(n^2) find smallest point/aggregation value.
12+
- 注意, 这道题我们update grid[][] sum up with shortest path value from building.
13+
- 最后找个min value 就好了, 甚至不用return coordinate.
14+
- 分析过, 还没有写.
15+
16+
```
17+
18+
/*
19+
You want to build a house on an empty land which reaches all buildings
20+
in the shortest amount of distance. You can only move up, down, left and right.
21+
You are given a 2D grid of values 0, 1 or 2, where:
22+
23+
Each 0 marks an empty land which you can pass by freely.
24+
Each 1 marks a building which you cannot pass through.
25+
Each 2 marks an obstacle which you cannot pass through.
26+
Example:
27+
28+
Input: [[1,0,2,0,1],[0,0,0,0,0],[0,0,1,0,0]]
29+
30+
1 - 0 - 2 - 0 - 1
31+
| | | | |
32+
0 - 0 - 0 - 0 - 0
33+
| | | | |
34+
0 - 0 - 1 - 0 - 0
35+
36+
Output: 7
37+
38+
Explanation: Given three buildings at (0,0), (0,4), (2,2), and an obstacle at (0,2),
39+
the point (1,2) is an ideal empty land to build a house, as the total
40+
travel distance of 3+3+1=7 is minimal. So return 7.
41+
Note:
42+
There will be at least one building.
43+
If it is not possible to build such house according to the above rules, return -1.
44+
45+
*/
46+
```

Java/Sliding Window Maximum.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
H
2+
tags: Sliding Window
23

34
用deque数据结构实际上采用LinkedList的形式来做一个递减的queue.
45
每次把小于当前node的全部剔除剩下的自然就是:最大的>第二大的>第三大的...ETC.

Java/Sliding Window Median.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
H
22
1533183594
3-
tags: Heap, Design, MaxHeap, MinHeap
3+
tags: Heap, Design, MaxHeap, MinHeap, Sliding Window
44

55
Data Stream Median 的同理题目: 不只是不断增加的Sequence, 而且要remove item (保持一个window size)
66

0 commit comments

Comments
 (0)