本文共 1666 字,大约阅读时间需要 5 分钟。
?????????????????????????????????????????????????????????????????????
????
???????????????????????????????????????????????????????? false?
????????? target????????
???????????????? dp??? dp[i][j] ??? i ??????????? j ?????????dp[0][0] ? true??????????0????
?????????????????????? dp ???????? nums[i]???? target ? nums[i] ??????? j??? dp[i][j] ???
??????? dp ???????? dp[i][target] ? true ?????????????????? true????? false?
????
class Solution { public boolean canPartition(int[] nums) { int sum = 0; int n = nums.length; for (int i = 0; i < n; i++) { sum += nums[i]; } if (sum % 2 != 0) { return false; } int target = sum / 2; boolean[][] dp = new boolean[n][target + 1]; if (nums[0] <= target) { dp[0][nums[0]] = true; } for (int i = 1; i < n; i++) { for (int j = 0; j <= target; j++) { dp[i][j] = dp[i-1][j]; if (j >= nums[i] && dp[i-1][j - nums[i]]) { dp[i][j] = true; } } } for (int i = 0; i < n; i++) { if (dp[i][target]) { return true; } } return false; }} ????
?????????????? sum??? sum ???????? false?
??????????? target?? sum / 2?
?????????????????? dp???? n x (target + 1)????? dp[0][0] ? true?
?????????????????? nums[i]??? dp ?????? j ? 0 ? target???????????? dp[i][j] = dp[i-1][j]????????????? dp[i-1][j - nums[i]] ??? true?????? dp[i][j] = true?
??????? dp ???????? dp[i][target] ? true ??????????? true????? false?
???????????????????????????????????????
发表评论
最新留言
关于作者