LeetCode #698 - Partition to K Equal Sum Subsets

本文探讨了如何将一个整数数组等分为k个非空子集,且每个子集的和相等的问题。通过使用回溯算法,我们提供了一个有效的解决方案,并详细解释了其工作原理,包括状态表示、剪枝条件和递归终止条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

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.

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.

class Solution {
public:
    bool canPartitionKSubsets(vector<int>& nums, int k) {
        bool result=false;
        int sum=0;
        for(int num:nums) sum+=num;
        if(sum%k!=0) return false;
        unordered_set<int> visited; //visited保存已经遍历过的元素的下标
        helper(nums,visited,sum/k,k,0,0,result);
        return result;
    }
    
    void helper(vector<int>& nums, unordered_set<int> visited, int target, int k, int cur_sum, int start, bool& result)
    {
        if(result==true) return;
        if(k==1) 
        {
            result=true;
            return;
        }
        else if(cur_sum==target) helper(nums,visited,target,k-1,0,0,result);
        else if(cur_sum>target) return;
        else
        {   //start参数很重要,令start从0开始,假设上一次递归遍历的是nums[i],那么i之前的数字也遍历过,下一次只需要从i+1开始即可
            for(int i=start;i<nums.size();i++)
            {
                if(visited.count(i)) continue;
                visited.insert(i);
                helper(nums,visited,target,k,cur_sum+nums[i],i+1,result);
                visited.erase(i);
            }
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值