698. Partition to K Equal Sum Subsets

来源:互联网 发布:程序员 团队贡献 编辑:程序博客网 时间:2024/06/05 20:51

问题描述:

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;
    }
};

原创粉丝点击