问题描述:
Given an array of integers nums
and a positive integer k
, find whether it's possible to divide this array into k
non-empty subsets whose sums are all equal.
给一个数组和一个正整数k,返回该数组是否可以分成k个子数组且各个子数组中的数和相等
问题解决:
算出数组中数的总和sum和平分成k份的值target
首先介绍递归函数recursive
传入原数组,要找到的目标数target2以及遍历数组的起始位置begin
从begin位置向前(即从大到小)遍历数组,每轮循环有三种情况
1.该数为0,已经分过组的数,continue
2.该数为target2,将该数置0,成功分组的组数加1,返回true
3.判断recursive(nums, target-nums[i], i-1)是否为true,若是,将nums[i]置0,返回true
给数组排序,从大到小遍历数组,每轮循环有三种情况
1.该数大于target,返回false
2.该数为0,已经分组过的数,继续循环
3.用递归函数找到可以和该数分在一组的其他数
最后判断数组是否全为0并且成功分组的组数n是否为k
若是返回true,否则返回false
代码如下:
class Solution {
public:
int n = 0;
bool recursive(vector<int>& nums, int target, int begin) {
int i;
for(i = begin; i >= 0; i--) {
if(nums[i] == 0) continue;
if(target == nums[i]) {
n++;
nums[i] = 0;
return true;
}
if(recursive(nums, target - nums[i], i-1)) {
nums[i] = 0;
return true;
}
}
return false;
}
bool canPartitionKSubsets(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int i, j;
int sum = 0;
for(i = 0; i < nums.size(); i++) {
sum += nums[i];
}
if(sum%k) return false;
int target = sum/k;
for(i = nums.size()-1; i >= 0; i--) {
if(nums[i] > target) return false;
else if(nums[i] == 0) continue;
else recursive(nums, target, i);
}
for(i = 0; i < nums.size(); i++) {
if(nums[i] != 0) return false;
}
return n == k;
}
};