Skip to content

Commit 8c4a439

Browse files
committed
DP
第二题时间复杂度要注意了 第三道解码方式简直傻逼
1 parent 6574692 commit 8c4a439

File tree

4 files changed

+198
-2
lines changed

4 files changed

+198
-2
lines changed

src/BFS/原点到特定点的最短路径.java

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,50 @@
77
* Created by 周杰伦 on 2018/3/31.
88
*/
99
public class 原点到特定点的最短路径 {
10-
public int minPathLength(int[][] grids, int tr, int tc) {
10+
//查询最短路径时,节点需要保存此时的长度信息,否则没办法得知长度。
11+
public static void main(String[] args) {
12+
int [][]a = {{1,1,0,1},
13+
{1,0,1,0},
14+
{1,1,1,1},
15+
{1,0,1,1}};
16+
System.out.println(minPathLength(a,3,3));
17+
}
18+
// public static int minPathLength(int[][] grids, int tr, int tc) {
19+
// if (grids == null)return 0;
20+
// int m = grids.length;
21+
// int n = grids[0].length;
22+
// if (tr > m || tr < 0 || tc > n || tc < 0)return 0;
23+
// int [][]go = {{0,1},{0,-1},{1,0},{-1,0}};
24+
// Queue<int []> queue = new LinkedList<>();
25+
// int []start = {0,0};
26+
// queue.offer(start);
27+
// int len = 0;
28+
// while (!queue.isEmpty()) {
29+
// int []a = queue.poll();
30+
// int r = a[0];
31+
// int c = a[1];
32+
//
33+
// for (int i = 0;i < go.length;i ++) {
34+
// int []pos = new int[2];
35+
// pos[0] = r + go[i][0];
36+
// pos[1] = c + go[i][1];
37+
// if (pos[0] >= 0 && pos[0] < m && pos[1] >= 0 && pos[1] < n) {
38+
// if (grids[pos[0]][pos[1]] == 1) {
39+
// grids[pos[0]][pos[1]] = 0;
40+
// if (pos[0] == tr && pos[1] == tc)return len;
41+
// queue.offer(pos);
42+
// }
43+
//
44+
// }
45+
// }
46+
// }
47+
// return len;
48+
// }
49+
50+
51+
52+
53+
public static int minPathLength(int[][] grids, int tr, int tc) {
1154
int[][] next = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
1255
int m = grids.length, n = grids[0].length;
1356
Queue<Position> queue = new LinkedList<>();
@@ -26,7 +69,7 @@ public int minPathLength(int[][] grids, int tr, int tc) {
2669
return -1;
2770
}
2871

29-
private class Position {
72+
private static class Position {
3073
int r, c, length;
3174
public Position(int r, int c, int length) {
3275
this.r = r;
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package DP;
2+
3+
/**
4+
* Created by 周杰伦 on 2018/4/3.
5+
*/
6+
public class 分割整数构成字母字符串 {
7+
public static void main(String[] args) {
8+
String a = "301";
9+
System.out.println(numDecodings(a));
10+
}
11+
12+
public static int numDecodings(String s) {
13+
if(s == null || s.length() == 0) {
14+
return 0;
15+
}
16+
int n = s.length();
17+
int[] dp = new int[n+1];
18+
dp[0] = 1;
19+
dp[1] = s.charAt(0) != '0' ? 1 : 0;
20+
for(int i = 2; i <= n; i++) {
21+
int first = Integer.valueOf(s.substring(i-1, i));
22+
int second = Integer.valueOf(s.substring(i-2, i));
23+
if(first >= 1 && first <= 9) {
24+
dp[i] += dp[i-1];
25+
}
26+
if(second >= 10 && second <= 26) {
27+
dp[i] += dp[i-2];
28+
}
29+
}
30+
return dp[n];
31+
}
32+
33+
34+
// public static int numDecodings(String s) {
35+
// if (s == null || s.equals(""))return 0;
36+
// if (s.equals("0"))return 0;
37+
// if (s.length() >= 2) {
38+
// String s1 = s.substring(0,2);
39+
// int l = Integer.parseInt(s1.substring(0,1));
40+
// int r = Integer.parseInt(s1.substring(1,2));
41+
// if (l == 0)return 0;
42+
// int m = l*10 + r;
43+
// if (r == 0 && s.length() == 2 && l < 3) return 1;
44+
// if (r == 0 && m > 26)return 0;
45+
// if (m > 0 && m <= 26) {
46+
// return 2;
47+
// }
48+
// else return 1;
49+
// }
50+
// //s = 1234
51+
// //dp[1] = 1 dp[2] = 2 dp[3] = 3 dp[4] = 3
52+
// int []dp = new int[s.length() + 1];
53+
// if (s.charAt(0) == '0') {
54+
// return 0;
55+
// }
56+
// else {
57+
// dp[1] = 1;
58+
// }
59+
// for (int i = 2;i <=s.length();i ++) {
60+
// int a = Integer.parseInt(s.substring(i-2,i-1));
61+
// int b = Integer.parseInt(s.substring(i - 1,i));
62+
// if (a == 0 && b == 0)return 0;
63+
// if (b == 0 && i == s.length()) {
64+
// if (a * 10 + b > 26) {
65+
// return 0;
66+
// }
67+
// dp[i] = dp[i - 1] - 1;
68+
// break;
69+
// }
70+
// if (a == 0 || b == 0) {
71+
// dp[i] = dp[i - 1];
72+
// continue;
73+
// }
74+
// int num = a * 10 + b ;
75+
// if (num > 0 && num <= 26) {
76+
// dp[i] = dp[i - 1] + 1;
77+
// }else {
78+
// dp[i] = dp[i - 1];
79+
// }
80+
// }
81+
// return dp[s.length()];
82+
// }
83+
84+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package DP;
2+
3+
/**
4+
* Created by 周杰伦 on 2018/4/3.
5+
*/
6+
public class 分割整数的最大乘积 {
7+
//2 = 1+1 1 /3 2+1 2/4 2+2 4/5 2+3 6/6 3+3 9
8+
// /7 3 2 2 12/8 = 3+3+2 18/9 = 3+3+3 27/10 = 3+3+4 36
9+
//dp[0] = 0 dp[1] = 0 dp[2] = 1; dp[3] = dp[2] + i - 1
10+
//dp[i] = dp[i-1]
11+
public int integerBreak(int n) {
12+
int []dp = new int[n + 1];
13+
dp[1] = 0;
14+
//dp[i]代表以以i为结尾的最大乘积。
15+
for (int i = 2;i <=n;i ++) {
16+
for (int j = 1;j < i;j ++) {
17+
//这一部是将n分成i和j两个数,要么取j要么取j分成的数。
18+
//要么取i-j要么取i-j拆分成的数,谁大就取谁。
19+
//再将这两部分相乘。并且dp是从左往右算的,可以保证有序。
20+
dp[i] = Math.max(dp[i],Math.max(j,dp[j])*Math.max(i - j,dp[i - j]));
21+
}
22+
}
23+
return dp[n];
24+
}
25+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package DP;
2+
3+
/**
4+
* Created by 周杰伦 on 2018/4/3.
5+
*/
6+
public class 按平方数来分割整数 {
7+
public static void main(String[] args) {
8+
System.out.println(numSquares(12));
9+
System.out.println(numSquares(13));
10+
11+
}
12+
//dp[1] = 1;
13+
//dp[2] = 2;
14+
//dp[3] = 3;
15+
//dp[4] = 1;dp[5] = 2 dp[6] = 3 dp[7]=4 dp[8]=2 dp[9]=3 dp[10]=2 dp[11]=3 dp[12] = 3
16+
//dp[i] = dp[i-j] + per
17+
//dp[i] = dp[i-1] + 1;huozhe dp[i-j] + which i-j = perfect
18+
public static int numSquares(int n) {
19+
int []dp = new int[n + 1];
20+
dp[1] = 1;
21+
dp[0] = 0;
22+
for (int k = 2;k <= n;k ++) {
23+
dp[k] = k;
24+
}
25+
26+
for (int i = 2;i <= n;i ++) {
27+
int j = 1;
28+
int min = dp[i];
29+
while (i - j*j >= 0 ) {
30+
min = Math.min(min,dp[i - j*j] + 1);
31+
j ++;
32+
}
33+
dp[i] = min;
34+
}
35+
36+
return dp[n];
37+
}
38+
public static boolean isPerfect(int n) {
39+
if (Math.pow(n,0.5) - Math.ceil(Math.pow(n,0.5)) == 0) {
40+
return true;
41+
}
42+
return false;
43+
}
44+
}

0 commit comments

Comments
 (0)