题目详情
Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.题目的意思是输入一个非空的、只含正整数的数组nums,要求我们判断,数组nums能否被分成两个子数组,满足两个子数组的和相等。
例1:
输入: [1, 5, 11, 5]
输出: true
解释: 输入数组可以被分为[1, 5, 5]和[11].
例2:
输入: [1, 2, 3, 5]
输出: false
解释: 数组无法被拆分成两个和相等的子数组.
想法
- 首先我们需要遍历一趟得到整个数组的和sum,从而求出每个子数组元素的加和(sum/2)。
- 如果sum是奇数的话,那一定是不满足条件的,可以直接返回false。如果sum是偶数,将sum除2获得我们要求的一个子数组元素的和。
- 如何暂存我们计算的中间结果呢?
- 声明一个长度为sum+1的布尔值数组res。每个元素的布尔值res[i]代表着,数组中是否存在满足加和为i的元素序列。
- 对于每一个元素,我们都要求出他以及前面遍历过的元素所组合出的元素和。
public boolean canPartition(int[] nums) {
int sum = 0;
for(int num : nums){
sum += num;
}
if(sum % 2 != 0)return false;
sum /= 2;
boolean[] res = new boolean[sum+1];
int length = nums.length;
res[0] = true;
for(int i=1;i<=length;i++){
for(int j=sum;j>=nums[i-1];j--){
res[j] = res[j-nums[i-1]] || res[j];
}
}
return res[sum];
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。