Skip to content

Commit 15a9a5a

Browse files
committed
20190220
1 parent 25fbc43 commit 15a9a5a

File tree

5 files changed

+172
-0
lines changed

5 files changed

+172
-0
lines changed

code/lc130.java

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package code;
2+
/*
3+
* 130. Surrounded Regions
4+
* 题意:把被 X 包围的 O 填补成 X
5+
* 难度:Medium
6+
* 分类:Depth-first Search, Breadth-first Search
7+
* 思路:把四条外围边框的O向内延伸填为1,剩下的O全部替换为X,再把1替换成O
8+
* Tips:
9+
*/
10+
public class lc130 {
11+
public static void main(String[] args) {
12+
char[][] board = {{'X','X','X','X'},{'X','O','O','X'},{'X','X','O','X'},{'X','O','X','X'}};
13+
solve(board);
14+
System.out.println(board);
15+
}
16+
public static void solve(char[][] board) {
17+
if(board.length==0) return;
18+
int[] row = {0, board.length-1};
19+
for (int i = 0; i <row.length ; i++) {
20+
for (int j = 0; j < board[0].length ; j++) {
21+
if(board[row[i]][j]=='O'){ // 注意是row[i],不是i
22+
dfs(board, row[i], j);
23+
}
24+
}
25+
}
26+
int[] col = {0, board[0].length-1};
27+
for (int i = 0; i <col.length ; i++) {
28+
for (int j = 0; j < board.length ; j++) {
29+
if(board[j][col[i]]=='O'){
30+
dfs(board, j, col[i]);
31+
}
32+
}
33+
}
34+
for (int i = 0; i < board.length ; i++) {
35+
for (int j = 0; j < board[0].length ; j++) {
36+
if(board[i][j]=='1')
37+
board[i][j] = 'O';
38+
else if(board[i][j]=='O')
39+
board[i][j] = 'X';
40+
}
41+
}
42+
}
43+
44+
public static void dfs(char[][] board, int row, int col){
45+
if(row<0||row>=board.length||col<0||col>=board[0].length) return;
46+
if(board[row][col]=='O') { //是 O 的话才继续递归
47+
board[row][col] = '1';
48+
dfs(board, row + 1, col);
49+
dfs(board, row - 1, col);
50+
dfs(board, row, col + 1);
51+
dfs(board, row, col - 1);
52+
}
53+
}
54+
}

code/lc131.java

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package code;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
/*
6+
* 131. Palindrome Partitioning
7+
* 题意:回文切割,找出所有切法
8+
* 难度:Medium
9+
* 分类:Backtracking
10+
* 思路:典型回溯法,注意向res添加内容时要重新new一下
11+
* Tips:lc39
12+
*/
13+
public class lc131 {
14+
public static void main(String[] args) {
15+
List res = partition("aab");
16+
System.out.println();
17+
}
18+
public static List<List<String>> partition(String s) {
19+
List<List<String>> res = new ArrayList<>();
20+
helper(s, res, new ArrayList<>());
21+
return res;
22+
}
23+
24+
public static void helper(String s, List<List<String>> res, List<String> curr){
25+
if(s.length()==0) {
26+
res.add(new ArrayList<>(curr)); //新new一个
27+
}
28+
for (int i = 1; i <= s.length() ; i++) {
29+
String curr_str = s.substring(0,i);
30+
if(isPalindrome(curr_str)){
31+
curr.add(curr_str);
32+
helper(s.substring(i), res, curr);
33+
curr.remove(curr.size()-1); //不要用curr.remove(curr_str); 会把集合内顺序打乱,AC不了
34+
}
35+
}
36+
}
37+
38+
public static boolean isPalindrome(String s){ //判断是否为回文
39+
int b =0;
40+
int e = s.length()-1;
41+
while(b<e){
42+
if(s.charAt(b)!=s.charAt(e))
43+
return false;
44+
b++;
45+
e--;
46+
}
47+
return true;
48+
}
49+
}

code/lc134.java

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package code;
2+
/*
3+
* 134. Gas Station
4+
* 题意:给两个数组,一个表示在该点能加多少油,一个表示该点到下个点消耗多少油,加油站连成一个环,问能否走遍所有加油站,从哪一站开始
5+
* 难度:Medium
6+
* 分类:Greedy
7+
* 思路:计算两个数组的差,再把每个位置加起来,如果>=0,则能跑完。位置为最大连续子数组的开始位置。
8+
* Tips:lc53
9+
*/
10+
public class lc134 {
11+
public int canCompleteCircuit(int[] gas, int[] cost) {
12+
int[] arr = new int[gas.length];
13+
int sum = 0, pos = 0, dp =0;
14+
for (int i = 0; i < arr.length ; i++) {
15+
arr[i] = gas[i] - cost[i];
16+
sum += arr[i];
17+
18+
if(dp<=0) { //最大连续子数组,并记录位置
19+
dp = arr[i];
20+
pos = i;
21+
}
22+
else
23+
dp += arr[i];
24+
}
25+
return sum<0? -1: pos;
26+
}
27+
}

code/lc140.java

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package code;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
/*
7+
* 140. Word Break II
8+
* 题意:给定词典,比照词典切字符串,能切出几种情况
9+
* 难度:Hard
10+
* 分类:Dynamic Programming, Backtracking
11+
* 思路:回溯法
12+
* Tips:和139做对比,因为需要每步骤返回值,所以递归的方法在这题更合适
13+
*/
14+
public class lc140 {
15+
public List<String> wordBreak(String s, List<String> wordDict) {
16+
List<String> res = new ArrayList<>();
17+
if(s.length()==0) return res;
18+
return helper(s, wordDict, new HashMap<>());
19+
}
20+
21+
public List<String> helper(String s, List<String> wordDict, HashMap<String, List<String>> hm){
22+
List<String> res = new ArrayList<>();
23+
if(hm.containsKey(s)) return hm.get(s); //hm用以记录子结果,之前递归已计算出,则直接返回。备忘录算法。
24+
for (int i = s.length()-1; i >=0 ; i--) {
25+
String cut_str = s.substring(i);
26+
if(wordDict.contains(cut_str)){
27+
List<String> ls = helper(s.substring(0,i), wordDict, hm); //切掉以后剩下的字符串的结果
28+
for(String str:ls){
29+
res.add(str+" "+cut_str); //结果拼上切掉的字符串
30+
}
31+
if(i==0){ //切完了,不需要拼空格。hm中没有保存键值为""的,上个循环不会有效果。
32+
res.add(cut_str);
33+
}
34+
hm.put(s, res);
35+
}
36+
}
37+
return res;
38+
}
39+
}

readme.md

+3
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ Language: Java
8888
| 125 [Java](./code/lc125.java)
8989
| 127 [Java](./code/lc127.java)
9090
| 128 [Java](./code/lc128.java)
91+
| 130 [Java](./code/lc130.java)
92+
| 131 [Java](./code/lc131.java)
93+
| 134 [Java](./code/lc134.java)
9194
| 136 [Java](./code/lc136.java)
9295
| 139 [Java](./code/lc139.java)
9396
| 141 [Java](./code/lc141.java)

0 commit comments

Comments
 (0)