本文主要是介绍力扣HOT100 - 416. 分割等和子集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
解题思路:
动态规划
对于当前考虑的元素 nums[i],如果 dp[ j - nums[ i ] ] 为 true,说明可以用前面的元素构成和为 j -nums[ i ] 的子集,那么在加上当前元素 nums[ i ] 的情况下,就可以构成和为 j 的子集,因此 dp[ j ] 更新为 true。如果 dp[ j - nums[ i ] ] 为 false,则说明无法使用前面的元素构成和为 j-nums[ i ] 的子集,那么无论如何也无法构成和为 j 的子集,因此 dp[ j ] 不变。
class Solution {public boolean canPartition(int[] nums) {int n = nums.length;if (n < 2) return false;int sum = 0, maxNum = 0;for (int num : nums) {sum += num;maxNum = Math.max(maxNum, num);}if (sum % 2 != 0) return false;int target = sum / 2;if (maxNum > target) return false;boolean[] dp = new boolean[target + 1];dp[0] = true;for (int i = 0; i < n; i++) {for (int j = target; j >= nums[i]; j--) {dp[j] = dp[j] || dp[j - nums[i]];}}return dp[target];}
}
这篇关于力扣HOT100 - 416. 分割等和子集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!