Partition to K Equal Sum Subsets
2018-01-16 00:00
351 查看
问题:
Given an array of integers
Example 1:
Note:
解决:
① 与Partition Equal Subset Sum类似,那道题只让分成两个子集合,所以问题可以转换为是否存在和为整个数组和的一半的子集合,可以用dp来做。但是这道题让求k个和相同的,感觉无法用dp来做,因为就算找出了一个,其余的也需要验证。
dfs,首先我们还是求出数组的所有数字之和sum,首先判断sum是否能整除k,不能整除的话直接返回false。然后需要一个visited数组来记录哪些数组已经被选中了,然后调用递归函数。
class Solution { //15ms
public boolean canPartitionKSubsets(int[] nums, int k) {
int sum = 0;
for (int n : nums){
sum += n;
}
if (k <= 0 || sum % k != 0) return false;
boolean[] isvisiteed = new boolean[nums.length];
return dfs(nums,k,sum / k,0,0,isvisiteed);
}
public boolean dfs(int[] nums,int k,int target,int i,int cursum,boolean[] isvisited){
if (k == 1) return true;
if (cursum == target) return dfs(nums,k - 1,target,0,0,isvisited);
for (int j = i;j < nums.length;j ++){
if (! isvisited[j] && nums[j] + cursum <= target){
isvisited[j] = true;
if (dfs(nums,k,target,j + 1,cursum + nums[j],isvisited)) return true;
isvisited[j] = false;
}
}
return false;
}
}
Given an array of integers
numsand a positive integer
k, find whether it's possible to divide this array into
knon-empty subsets whose sums are all equal.
Example 1:
Input: nums = [4, 3, 2, 3, 5, 2, 1], k = 4 Output: True Explanation: It's possible to divide it into 4 subsets (5), (1, 4), (2,3), (2,3) with equal sums.
Note:
1 <= k <= len(nums) <= 16.
0 < nums[i] < 10000.
解决:
① 与Partition Equal Subset Sum类似,那道题只让分成两个子集合,所以问题可以转换为是否存在和为整个数组和的一半的子集合,可以用dp来做。但是这道题让求k个和相同的,感觉无法用dp来做,因为就算找出了一个,其余的也需要验证。
dfs,首先我们还是求出数组的所有数字之和sum,首先判断sum是否能整除k,不能整除的话直接返回false。然后需要一个visited数组来记录哪些数组已经被选中了,然后调用递归函数。
class Solution { //15ms
public boolean canPartitionKSubsets(int[] nums, int k) {
int sum = 0;
for (int n : nums){
sum += n;
}
if (k <= 0 || sum % k != 0) return false;
boolean[] isvisiteed = new boolean[nums.length];
return dfs(nums,k,sum / k,0,0,isvisiteed);
}
public boolean dfs(int[] nums,int k,int target,int i,int cursum,boolean[] isvisited){
if (k == 1) return true;
if (cursum == target) return dfs(nums,k - 1,target,0,0,isvisited);
for (int j = i;j < nums.length;j ++){
if (! isvisited[j] && nums[j] + cursum <= target){
isvisited[j] = true;
if (dfs(nums,k,target,j + 1,cursum + nums[j],isvisited)) return true;
isvisited[j] = false;
}
}
return false;
}
}
相关文章推荐
- LWC 54:698. Partition to K Equal Sum Subsets
- LeetCode #698 Partition to K Equal Sum Subsets
- [LeetCode] Partition to K Equal Sum Subsets
- 698. Partition to K Equal Sum Subsets
- 698. Partition to K Equal Sum Subsets
- LeetCode#698 Partition to K Equal Sum Subsets(week19)
- 698. Partition to K Equal Sum Subsets(M)
- 698. Partition to K Equal Sum Subsets
- LeetCode Partition to K Equal Sum Subsets
- LeetCode算法问题12 —— Partition to K Equal Sum Subsets
- 698. Partition to K Equal Sum Subsets
- 698. Partition to K Equal Sum Subsets
- 698 Partition to K Equal Sum Subsets
- Partition to K Equal Sum Subsets
- 698. Partition to K Equal Sum Subsets
- LeetCoe 698 (Partition to K Equal Sum Subsets)
- 698[Medium]: Partition to K Equal Sum Subsets
- [LeetCode] Partition to K Equal Sum Subsets 分割K个等和的子集
- Leetcode | Partition to K Equal Sum Subsets
- Partition to K Equal Sum Subsets