mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 03:34:02 +08:00
Merge pull request #2100 from Lozakaka/patch-16
新增java二維"整數"數組的解法、優化一維數組的解法(剪枝)
This commit is contained in:
@ -218,8 +218,12 @@ class Solution {
|
|||||||
for(int i = 0; i < n; i++) {
|
for(int i = 0; i < n; i++) {
|
||||||
for(int j = target; j >= nums[i]; j--) {
|
for(int j = target; j >= nums[i]; j--) {
|
||||||
//物品 i 的重量是 nums[i],其价值也是 nums[i]
|
//物品 i 的重量是 nums[i],其价值也是 nums[i]
|
||||||
dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i]);
|
dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//剪枝一下,每一次完成內層的for-loop,立即檢查是否dp[target] == target,優化時間複雜度(26ms -> 20ms)
|
||||||
|
if(dp[target] == target)
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return dp[target] == target;
|
return dp[target] == target;
|
||||||
}
|
}
|
||||||
@ -294,6 +298,61 @@ false true false false false true true false false false false false
|
|||||||
false true false false false true true false false false false true
|
false true false false false true true false false false false true
|
||||||
false true false false false true true false false false true true
|
false true false false false true true false false false true true
|
||||||
```
|
```
|
||||||
|
二維數組整數版本
|
||||||
|
```Java
|
||||||
|
class Solution {
|
||||||
|
public boolean canPartition(int[] nums) {
|
||||||
|
//using 2-D DP array.
|
||||||
|
int len = nums.length;
|
||||||
|
//check edge cases;
|
||||||
|
if(len == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int sum = 0;
|
||||||
|
for (int num : nums)
|
||||||
|
sum += num;
|
||||||
|
//we only deal with even numbers. If sum is odd, return false;
|
||||||
|
if(sum % 2 == 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int target = sum / 2;
|
||||||
|
int[][] dp = new int[nums.length][target + 1];
|
||||||
|
|
||||||
|
// for(int j = 0; j <= target; j++){
|
||||||
|
// if(j < nums[0])
|
||||||
|
// dp[0][j] = 0;
|
||||||
|
// else
|
||||||
|
// dp[0][j] = nums[0];
|
||||||
|
// }
|
||||||
|
|
||||||
|
//initialize dp array
|
||||||
|
for(int j = nums[0]; j <= target; j++){
|
||||||
|
dp[0][j] = nums[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 1; i < len; i++){
|
||||||
|
for(int j = 0; j <= target; j++){
|
||||||
|
if (j < nums[i])
|
||||||
|
dp[i][j] = dp[i - 1][j];
|
||||||
|
else
|
||||||
|
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//print out DP array
|
||||||
|
// for(int x : dp){
|
||||||
|
// System.out.print(x + ",");
|
||||||
|
// }
|
||||||
|
// System.out.print(" "+i+" row"+"\n");
|
||||||
|
return dp[len - 1][target] == target;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//dp数组的打印结果 for test case 1.
|
||||||
|
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
0, 1, 1, 1, 1, 5, 6, 6, 6, 6, 6, 6,
|
||||||
|
0, 1, 1, 1, 1, 5, 6, 6, 6, 6, 6, 11,
|
||||||
|
0, 1, 1, 1, 1, 5, 6, 6, 6, 6, 10, 11,
|
||||||
|
```
|
||||||
|
|
||||||
### Python:
|
### Python:
|
||||||
```python
|
```python
|
||||||
|
Reference in New Issue
Block a user