Skip to content

Commit 3fbfdd5

Browse files
committedAug 10, 2022
add leetcode: 78,79
1 parent ab31d38 commit 3fbfdd5

File tree

3 files changed

+83
-0
lines changed

3 files changed

+83
-0
lines changed
 

‎Algorithm/src/leetCode/subject/number51_100/_76MinimumCoverString.java

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package leetCode.subject.number51_100;
22

33
import java.util.HashMap;
4+
import java.util.Map;
45

56
/**
67
* @author : CodeWater
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package leetCode.subject.number51_100;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**
7+
* @author : CodeWater
8+
* @create :2022-08-10-21:49
9+
* @Function Description :76.子集
10+
*/
11+
public class _78Subset {
12+
class Solution {
13+
/**用二进制0/1来表示每一个元素选或者不选。比如有三个元素,用000到111表示。
14+
也就是选择的方案数在0到2的n次方减1种。
15+
011:选择第一个和第二个元素
16+
*/
17+
public List<List<Integer>> subsets(int[] nums) {
18+
List<List<Integer>> res = new ArrayList<>();
19+
int n = nums.length;
20+
// 枚举从0到2^n -1 (1左移n位,在这里表示i小于n个元素表示下的最大二进制数)
21+
for( int i = 0 ; i < 1 << n ; i++ ){
22+
// 方案数共有2^n种,从小枚举每一种
23+
List<Integer> path = new ArrayList<>();
24+
// 看看第j位(也就是看i对应在nums中第j个元素)有没有选择过
25+
for( int j = 0 ; j < n ; j++ ){
26+
// i右移j位,第j位1表示选择改位
27+
if( (i >> j & 1) == 1 )
28+
// 添加改元素
29+
path.add(nums[j]);
30+
}
31+
// 内层循环完,就是一种方案
32+
res.add(path);
33+
}
34+
return res;
35+
}
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package leetCode.subject.number51_100;
2+
3+
/**
4+
* @author : CodeWater
5+
* @create :2022-08-10-22:24
6+
* @Function Description :79. 单词搜索
7+
*/
8+
public class _79WordSearch {
9+
class Solution {
10+
public boolean exist(char[][] board, String word) {
11+
for( int i = 0 ; i < board.length ; i++ ){
12+
for( int j = 0 ; j < board[i].length ; j++ ){
13+
if( dfs( board , word , 0 , i , j ) ) return true;
14+
}
15+
}
16+
return false;
17+
18+
}
19+
20+
// 上有下左四个方向的遍历数组
21+
int[] dx = {-1 , 0 , 1 , 0 } , dy = {0 , 1 , 0 , -1};
22+
23+
// u表示遍历的第几个字符
24+
public boolean dfs(char[][] board , String word , int u , int i , int j ){
25+
// 剪枝
26+
if( board[i][j] != word.charAt(u) ) return false;
27+
// 找到一种解
28+
if( u == word.length() -1 ) return true;
29+
30+
char t = board[i][j];
31+
// 标记当前位置遍历过(用一个题目中不会出现的字符)
32+
board[i][j] = '-';
33+
for( int k = 0 ; k < 4 ; k++ ){
34+
// 下一步
35+
int a = i + dx[k] , b = j + dy[k];
36+
if( a < 0 || a >= board.length || b < 0 || b >= board[0].length || board[a][b] == '-' ) continue;
37+
if( dfs( board , word , u + 1 , a , b ) ) return true;
38+
39+
}
40+
// 恢复现场
41+
board[i][j] = t;
42+
return false;
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)
Please sign in to comment.