Skip to content

Commit 6725a09

Browse files
committed
动态规划:152.乘积最大子数组、279.完全平方数
1 parent 767bcdf commit 6725a09

File tree

3 files changed

+87
-0
lines changed

3 files changed

+87
-0
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
141. 环形链表
3838
144. 二叉树的前序遍历
3939
145. 二叉树的后序遍历
40+
152. 乘积最大子数组
4041
155. 最小栈
4142
160. 相交链表
4243
169. 多数元素
@@ -46,6 +47,7 @@
4647
226. 翻转二叉树
4748
234. 回文链表
4849
236. 二叉树的最近公共祖先
50+
279. 完全平方数
4951
283. 移动零
5052
300. 最长上升子序列
5153
303. 区域和检索 - 数组不可变

leetcode_Java/Solution0152.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// 152. 乘积最大子数组
2+
3+
4+
/*
5+
1、res记录子数组最大乘积,imax表示以nums[i]结尾的子数组最大乘积,imin表示以nums[i]结尾的子数组最小乘积
6+
2、遍历数据,计算当前最大值,不断更新res
7+
3、由于存在负数,那么会导致最大的变最小的,最小的变最大的。因此还需要维护当前最小值imin,当负数出现时则imax与imin进行交换再进行下一步计算
8+
*/
9+
class Solution {
10+
public int maxProduct(int[] nums) {
11+
int res = nums[0], imax = 1, imin = 1;
12+
for (int i = 1; i < nums.length; i++) {
13+
if (nums[i] < 0) {
14+
int temp = imax;
15+
imax = imin;
16+
imin = temp;
17+
}
18+
imax = Math.max(imax * nums[i], nums[i]);
19+
imin = Math.min(imin * nums[i], nums[i]);
20+
res = Math.max(res, imax);
21+
}
22+
return res;
23+
}
24+
}
25+
26+
27+
/*
28+
动态规划:
29+
1、dpMax[i]表示以i位置结尾的子数组最大乘积,dpMin[i]表示以i位置结尾的子数组最小乘积
30+
*/
31+
class Solution {
32+
public int maxProduct(int[] nums) {
33+
int res;
34+
int[] dpMax = new int[n];
35+
int[] dpMin = new int[n];
36+
res = dpMax[0] = dpMin[0] = nums[0];
37+
for (int i = 1; i < n; i++) {
38+
dpMax[i] = Math.max(nums[i], Math.max(dpMax[i - 1] * nums[i], dpMin[i - 1] * nums[i]));
39+
dpMin[i] = Math.min(nums[i], Math.min(dpMax[i - 1] * nums[i], dpMin[i - 1] * nums[i]));
40+
res = Math.max(res, dpMax[i]);
41+
}
42+
return res;
43+
}
44+
}
45+
46+
47+
/*
48+
优化空间,使用变量替代dp数组
49+
*/
50+
class Solution {
51+
public int maxProduct(int[] nums) {
52+
int res = nums[0], imax = 1, imin = 1;
53+
for (int i = 0; i < nums.length; i++) {
54+
int imaxOld = imax, iminOld = imin;
55+
imax = Math.max(nums[i], Math.max(imaxOld * nums[i], iminOld * nums[i]));
56+
imin = Math.min(nums[i], Math.min(imaxOld * nums[i], iminOld * nums[i]));
57+
res = Math.max(res, imax);
58+
}
59+
return res;
60+
}
61+
}

leetcode_Java/Solution0279.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// 279. 完全平方数
2+
3+
4+
/*
5+
动态规划:
6+
1、dp[i]表示和为i的完全平方数的最少数量
7+
2、遍历1-n,填充dp[i]元素
8+
3、初始化 dp[i] = i,表示最后情况全部由1相加,数量为i
9+
4、状态转移方程:dp[i] = Math.min(dp[i], dp[i - j * j] + 1);
10+
5、j*j 是一个完全平方数,i-j*j 表示减去一个完全平方数的值,dp[i-j*j] 表示和为 i-j*j 完全平方数的最少数量,dp[i-j*j] + 1 表示和为i的完全平方数的数量
11+
6、构成i有多个完全平方数相加,所以遍历j,每次减去一个j*j的完全平方数,由旧状态加1直接得到当前值数量,比较得到最少数量
12+
*/
13+
class Solution {
14+
public int numSquares(int n) {
15+
int[] dp = new int[n + 1];
16+
for (int i = 1; i <= n; i++) {
17+
dp[i] = i;
18+
for (int j = 1; j * j <= i; j++) {
19+
dp[i] = Math.min(dp[i], dp[i - j * j] + 1);
20+
}
21+
}
22+
return dp[n];
23+
}
24+
}

0 commit comments

Comments
 (0)