Skip to content

Commit dc36493

Browse files
author
digitspace
committed
569-Week 08
1 parent b2bbaa2 commit dc36493

File tree

4 files changed

+265
-0
lines changed

4 files changed

+265
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package week08;
2+
import java.util.Arrays;
3+
4+
/*
5+
* 300. Longest Increasing Subsequence
6+
* 最长上升子序列
7+
*
8+
* 给定一个无序的整数数组,找到其中最长上升子序列的长度。
9+
10+
示例:
11+
12+
输入: [10,9,2,5,3,7,101,18]
13+
输出: 4
14+
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
15+
说明:
16+
17+
可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
18+
你算法的时间复杂度应该为 O(n2) 。
19+
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
20+
21+
*/
22+
public class LeetCode_300_569 {
23+
24+
public static void main(String[] args) {
25+
// TODO Auto-generated method stub
26+
27+
}
28+
29+
//状态定义dp[i], 表示当包含nums[i]的这个位置最长上升子序列的长度
30+
//状态方程 dp[i] = max(所有dp[j]) {0<=j<i且num[j]<num[i]的所有值}
31+
class Solution {
32+
public int lengthOfLIS(int[] nums) {
33+
if( nums.length == 0 )
34+
return 0;
35+
int[] dp = new int[nums.length];
36+
Arrays.fill(dp, 1);
37+
int max = 1;
38+
for(int i = 1; i < dp.length; i++) {
39+
for( int j = 0; j < i; j++ ) {
40+
if( nums[j] < nums[i] )
41+
dp[i] = Math.max(dp[i], dp[j]+1);
42+
}
43+
max = Math.max(max, dp[i]);
44+
}
45+
return max;
46+
}
47+
}
48+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package week08;
2+
/*
3+
* 63. Unique Paths II
4+
*
5+
* 个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
6+
7+
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
8+
9+
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
10+
11+
网格中的障碍物和空位置分别用 1 和 0 来表示。
12+
13+
说明:m 和 n 的值均不超过 100。
14+
15+
示例 1:
16+
17+
输入:
18+
[
19+
  [0,0,0],
20+
  [0,1,0],
21+
  [0,0,0]
22+
]
23+
输出: 2
24+
解释:
25+
3x3 网格的正中间有一个障碍物。
26+
从左上角到右下角一共有 2 条不同的路径:
27+
1. 向右 -> 向右 -> 向下 -> 向下
28+
2. 向下 -> 向下 -> 向右 -> 向右
29+
30+
*/
31+
public class LeetCode_63_569 {
32+
33+
public static void main(String[] args) {
34+
// TODO Auto-generated method stub
35+
36+
}
37+
38+
/*
39+
* dp[i][j] i表示行坐标,j表示列坐标,dp[i][j]表示在i,j这个坐标的路径数
40+
* dp[i][j] = dp[i-1][j] + dp[i][j-1]; i,j路径等于上面点路径和左边点路径之和
41+
* 第一行第一列路径皆为1,如果有障碍则该点和后续皆为0
42+
*/
43+
class Solution {
44+
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
45+
if( obstacleGrid[0][0] == 1 )
46+
return 0;
47+
int[][] dp = new int[obstacleGrid.length][obstacleGrid[0].length];
48+
dp[0][0] = 1;
49+
for( int i = 1; i < dp.length; i++ )
50+
dp[i][0] =( dp[i-1][0] == 1 && obstacleGrid[i][0] != 1 ) ? 1 : 0;
51+
for( int i = 1; i < dp[0].length; i++ )
52+
dp[0][i] =( dp[0][i-1] == 1 && obstacleGrid[0][i] != 1 ) ? 1 : 0;
53+
for( int i = 1; i < dp.length; i++ ) {
54+
for( int j = 1; j < dp[0].length; j++ ) {
55+
if( obstacleGrid[i][j] != 1 ) {
56+
dp[i][j] = dp[i-1][j] + dp[i][j-1];
57+
}else {
58+
dp[i][j] = 0;
59+
}
60+
}
61+
}
62+
return dp[dp.length-1][dp[0].length-1];
63+
}
64+
}
65+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package week08;
2+
3+
/*
4+
* 8. String to Integer (atoi)
5+
* 字符串转换整数 (atoi)
6+
*/
7+
public class LeetCode_8_569 {
8+
9+
public static void main(String[] args) {
10+
// TODO Auto-generated method stub
11+
String str = " ";
12+
System.out.println( new LeetCode_8_569().new Solution().myAtoi(str) );
13+
}
14+
15+
class Solution {
16+
public int myAtoi(String str) {
17+
if( str.length() <= 0 )
18+
return 0;
19+
int idx = 0;
20+
int sign = 1;
21+
int result = 0;
22+
while( idx < str.length() && str.charAt(idx) == ' ' )
23+
idx++;
24+
if( idx < str.length() && (str.charAt(idx) == '+' || str.charAt(idx) == '-') ){
25+
sign = str.charAt(idx) == '+' ? 1 : -1;
26+
idx++;
27+
}
28+
while ( idx < str.length() ) {
29+
int digit = str.charAt(idx) - '0';
30+
if ( digit < 0 || digit > 9 )
31+
break;
32+
if (result > (Integer.MAX_VALUE - digit) / 10) {
33+
return (sign == 1)? Integer.MAX_VALUE : Integer.MIN_VALUE;
34+
}
35+
result = result * 10 + digit;
36+
idx++;
37+
}
38+
return result * sign;
39+
40+
}
41+
}
42+
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package week08;
2+
3+
/*
4+
* 91. Decode Ways
5+
* 解码方法
6+
* 一条包含字母 A-Z 的消息通过以下方式进行了编码:
7+
8+
'A' -> 1
9+
'B' -> 2
10+
...
11+
'Z' -> 26
12+
给定一个只包含数字的非空字符串,请计算解码方法的总数。
13+
14+
示例 1:
15+
16+
输入: "12"
17+
输出: 2
18+
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
19+
示例 2:
20+
21+
输入: "226"
22+
输出: 3
23+
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
24+
25+
26+
*/
27+
28+
public class LeetCode_91_569 {
29+
30+
public static void main(String[] args) {
31+
// TODO Auto-generated method stub
32+
String s = "12";
33+
int result = new LeetCode_91_569().new Solution().numDecodings(s);
34+
System.out.println( result );
35+
}
36+
37+
/*
38+
* 自右至左
39+
* 定义状态数组: dp[i] 代表从第i位到最后的字串的解码方法
40+
* dp方程:
41+
* 如果s[i]=0, dp[i]=0
42+
* 如果s[i]+s[i+1] <= 26, dp[i] = dp[i+1]+dp[i+2]
43+
* 如果s[i]+s[i+1] > 26, dp[i] = dp[i+1]
44+
*
45+
*/
46+
class Solution1 {
47+
public int numDecodings(String s) {
48+
int n = s.length();
49+
if( n <= 0)
50+
return 0;
51+
52+
int[] dp = new int[n+1];
53+
dp[n] = 1;
54+
dp[n-1] = s.charAt(n-1) != '0' ? 1 : 0;
55+
56+
for( int i = n-2; i >= 0; i-- ) {
57+
if ( s.charAt(i) == '0') {
58+
dp[i] = 0;
59+
} else if (Integer.parseInt(s.substring(i,i+2)) <= 26 ) {
60+
dp[i] = dp[i+1] + dp[i+2];
61+
} else {
62+
dp[i] = dp[i+1];
63+
}
64+
}
65+
return dp[0];
66+
}
67+
}
68+
69+
//状态定义:
70+
// dp[i] 代表s[0..i]总共解码个数
71+
//状态方程:
72+
// if s[i] = 0
73+
// if s[i-1] = 1 || 2
74+
// dp[i] = dp[i-2]
75+
// else
76+
// return 0;
77+
// if s[i] != 0
78+
// if s[i-1,i] <= 26 && s[i-1,i] > 10
79+
// dp[i] = dp[i-1] + dp[i-2]
80+
// else s[i-1,i] < 10 || s[i-1,i] > 26
81+
// dp[i] = dp[i-1]
82+
83+
class Solution {
84+
public int numDecodings(String s) {
85+
int n = s.length();
86+
if( n <= 0)
87+
return 0;
88+
89+
int[] dp = new int[n+1];
90+
dp[0] = 1;
91+
dp[1] = s.charAt(0) != '0' ? 1 : 0;
92+
93+
for( int i = 1; i < s.length(); i++ ) {
94+
if ( s.charAt(i) == '0') {
95+
if( s.charAt(i-1) == '1' || s.charAt(i-1) == '2' ) {
96+
dp[i+1] = dp[i-1];
97+
}else {
98+
return 0;
99+
}
100+
} else if (Integer.parseInt(s.substring(i-1,i+1)) <= 26
101+
&& Integer.parseInt(s.substring(i-1,i+1)) > 10 ) {
102+
dp[i+1] = dp[i] + dp[i-1];
103+
} else {
104+
dp[i+1] = dp[i];
105+
}
106+
}
107+
return dp[n];
108+
}
109+
}
110+
}

0 commit comments

Comments
 (0)