[Leetcode]698.Partition to K Equal Sum Subsets
链接:LeetCode698
给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
示例 1:
输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。
相关标签:深度优先搜索
通过深度优先搜索即可解决。关键点是,当我们在找形成target的子数组时,要首先考虑数组中大的数,因为如果小的数能组成大数,那么首先利用大数可以避免后面的小数用完,大数无法组成target的情况。想通这一点,其实这道题就能通过常规方法解决了。
其代码如下:
python:
class Solution:
def canPartitionKSubsets(self, nums: List[int], k: int) -> bool:
sum_ = sum(nums)
if sum_%k or max(nums)>sum_//k:return False
nums.sort(reverse=True)
return self.dfs(nums,sum_//k,sum_//k)
def dfs(self,nums,cur,target):
if not nums and not cur:return True
if not cur:
cur = target
for i in range(len(nums)):
if cur >= nums[i]:
rest = nums[:i]+nums[i+1:]
if self.dfs(rest,cur-nums[i],target):
return True
return False
C++:
class Solution {
public:
bool canPartitionKSubsets(vector<int>& nums, int k) {
int sum_ = accumulate(nums.begin(),nums.end(),0);
if(sum_%k!=0 || *max_element(nums.begin(),nums.end())>sum_/k) return false;
sort(nums.begin(),nums.end(),greater<int>());
int target = sum_/k;
return dfs(nums,target,target);
}
bool dfs(vector<int> &nums,int cur,int target){
if(nums.empty() && cur==0){return true;}
if(cur==0) {
cur=target;
}
for(int i=0;i<nums.size();++i){
if(cur>=nums[i]){
vector<int> rest;
for(int j=0;j<nums.size();++j){
if(j!=i){rest.push_back(nums[j]);}
}
if(dfs(rest,cur-nums[i],target)){return true;}
}
}
return false;
}
};
标签:
OJ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)