leetcode 698. 划分为k个相等的子集

本文探讨了如何将一个整数数组分割成k个非空子集,使其总和相等的问题。通过深度搜索和剪枝策略,实现了一个有效的算法解决方案。示例展示了算法的应用,包括输入和预期输出。

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

给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。

示例 1:

输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。

题目地址

思路:用now[k]代表目前k组元素的和分别是多少,对于每个nums[i]枚举分到0-k-1组,直到每个元素都被分完看看是否能够满足题意。

这个想法并不够快,如果不加剪枝甚至会超时,于是加了一个简单的剪枝,分配每个元素时,看看还有多少组元素和没有达到目标要求,如果有m组未达标,现在只有n个元素未分配,且m>n,那么这组分配必然不满足要求,直接返回false即可。

class Solution {
    int now[] = new int [20];//每个集合目前的元素和
    int l;
    int sum;
    public boolean dfs(int[] nums,int n,int k)
    {
        int cnt = 0;
        for(int i=0;i<k;i++)
        {
            if(now[i]!=sum)
               cnt++;
        }
        if(cnt>l-n)//简单剪枝
          return false;
        if(n==l)
        {
            for(int i=0;i<k;i++)
            {
                if(now[i]!=sum)
                   return false;
            }
            return true;
        }
        for(int i=0;i<k;i++)
        {
            if(nums[n]+now[i]<=sum)
            {
                now[i]+=nums[n];
                boolean seven = dfs(nums,n+1,k);
                if(seven)
                   return true;
                now[i]-=nums[n];
            }
        }
        return false;
    }
    public boolean canPartitionKSubsets(int[] nums, int k) {
        l = nums.length;
        sum = 0;
        for(int i=0;i<l;i++)
            sum+=nums[i];
        if(sum%k!=0)
           return false;
        sum/=k;
        return dfs(nums,0,k);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值