Skip to content

Commit a5a6eea

Browse files
author
zhangruihao.zhang
committed
第一周
1 parent 1942f22 commit a5a6eea

1 file changed

Lines changed: 60 additions & 0 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import java.util.Arrays;
2+
3+
/**
4+
* @author zhangruihao.zhang
5+
* @version v1.0.0
6+
* @since 2019/05/04
7+
*/
8+
public class LeetCode_698_108 {
9+
//这道题没调出来,看的别人的答案
10+
class Solution {
11+
public boolean canPartitionKSubsets(int[] nums, int k) {
12+
//因为题目限制条件不用担心溢出
13+
int sum = 0;
14+
for(int i = 0; i < nums.length; i++){
15+
sum += nums[i];
16+
}
17+
if(sum % k != 0){
18+
return false;
19+
}
20+
//求出子集的和
21+
sum = sum / k;
22+
//排序 小的放最前面大的放最后面
23+
Arrays.sort(nums);
24+
//如果子集的和小于数组最大的直接返回false
25+
if(nums[nums.length - 1] > sum){
26+
return false;
27+
}
28+
//建立一个长度为k的桶
29+
int[] arr = new int[k];
30+
//桶的每一个值都是子集的和
31+
Arrays.fill(arr, sum);
32+
//从数组最后一个数开始进行递归
33+
return help(nums, nums.length - 1, arr, k);
34+
}
35+
36+
boolean help(int[] nums, int cur, int[] arr, int k){
37+
//已经遍历到了-1说明前面的所有数都正好可以放入桶里,那所有桶的值此时都为0,说明找到了结果,返回true
38+
if(cur < 0){
39+
return true;
40+
}
41+
//遍历k个桶
42+
for(int i = 0; i < k; i++){
43+
//如果正好能放下当前的数或者放下当前的数后,还有机会继续放前面的数(剪枝)
44+
if(arr[i] == nums[cur] || (cur > 0 && arr[i] - nums[cur] >= nums[0])){
45+
//放当前的数到桶i里
46+
arr[i] -= nums[cur];
47+
//开始放下一个数
48+
if(help(nums, cur - 1, arr, k)){
49+
return true;
50+
}
51+
//这个数不该放在桶i中
52+
//从桶中拿回当前的数
53+
arr[i] += nums[cur];
54+
}
55+
}
56+
return false;
57+
}
58+
59+
}
60+
}

0 commit comments

Comments
 (0)