File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments