Skip to content

Commit 711a312

Browse files
committed
698. 划分为k个相等的子集
1 parent e2d29ff commit 711a312

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,5 @@
4343
543. 二叉树的直径
4444
560. 和为 K 的子数组
4545
589. N叉树的前序遍历
46-
617. 合并二叉树
46+
617. 合并二叉树
47+
698. 划分为k个相等的子集

leetcode_Java/Solution0698.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// 划分为k个相等的子集
2+
3+
4+
class Solution {
5+
public boolean canPartitionKSubsets(int[] nums, int k) {
6+
// 排除一些基本情况
7+
if (k > nums.length) {
8+
return false;
9+
}
10+
int sum = 0;
11+
for (int v : nums) {
12+
sum += v;
13+
}
14+
if (sum % k != 0) {
15+
return false;
16+
}
17+
// 使用位图技巧
18+
int used = 0;
19+
int target = sum / k;
20+
// k 号桶初始什么都没装,从 nums[0] 开始做选择
21+
return backtrack(k, 0, nums, 0, used, target);
22+
}
23+
24+
HashMap<Integer, Boolean> memo = new HashMap<>();
25+
26+
// 方法作用:判断一个桶是否能被装满,即是否有子集和为目标值
27+
boolean backtrack(int k, int bucket, int[] nums, int start, int used, int target) {
28+
if (k == 0) {
29+
// 所有桶都被装满了,而且 nums 一定全部用完了
30+
return true;
31+
}
32+
if (bucket == target) {
33+
// 装满了当前桶,递归穷举下一个桶的选择,让下一个桶从 nums[0] 开始选数字
34+
boolean res = backtrack(k - 1, 0, nums, 0, used, target);
35+
// 缓存结果
36+
memo.put(used, res);
37+
return res;
38+
}
39+
if (memo.containsKey(used)) {
40+
// 避免冗余计算
41+
return memo.get(used);
42+
}
43+
for (int i = start; i < nums.length; i++) {
44+
// 剪枝,判断索引 i 的元素是否已使用
45+
if (((used >> i) & 1) == 1) {
46+
continue;
47+
}
48+
if (nums[i] + bucket > target) {
49+
continue;
50+
}
51+
// 做选择,使第 i 位置为 1,表示索引 i 的元素已使用
52+
used |= 1 << i;
53+
bucket += nums[i];
54+
// 递归穷举下一个数字是否装入当前桶
55+
if (backtrack(k, bucket, nums, i + 1, used, target)) {
56+
return true;
57+
}
58+
// 撤销选择,将第 i 位置为 0,表示索引 i 的元素未使用
59+
used ^= 1 << i;
60+
bucket -= nums[i];
61+
}
62+
return false;
63+
}
64+
}

0 commit comments

Comments
 (0)