原题链接https://leetcode.com/problems/partition-to-k-equal-sum-subsets/
题目描述
Given an array of integers nums and a positive integer k, find whether it’s possible to divide this array into k non-empty subsets whose sums are all equal.
Example 1:
Input: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
Output: True
Explanation: It’s possible to divide it into 4 subsets (5), (1, 4), (2,3), (2,3) with equal sums.
Note:
1 <= k <= len(nums) <= 16.
0 < nums[i] < 10000.
思路分析
给定一个整数数组,一个整数,返回是否数组能够被分为k个等值的子集。
直观的想,用递归,一个一个子集的凑,一旦有凑不上的则返回false
还有就是注意些特殊情况:
- 分组数大于数组的长度,返回false
- 若数组元素之和不能被数组数整除,则肯定不能满足分组,返回false
- 若分组数为1的话,直接返回数组本身就好,显然返回true
- 当有超过平均值的数组元素,返回false
notes : 一定记得回溯……
笔者小陌第N次忘记回溯(╯︵╰)
AC解
class Solution {
public boolean canPartitionKSubsets(int[] nums, int k) {
if(k == 1)
{
return true;
}
if(nums == null || nums.length == 0 || k > nums.length)
{
return false;
}
int sum = 0;
int max = 0;
for(int i:nums)
{
sum = sum + i ;
max = Math.max(max,i);
}
if(sum % k != 0 || sum / k < max)
{
return false;
}
boolean[] flag = new boolean[nums.length];
return dfs(nums,flag,k,sum /k,0,0);
}
public boolean dfs(int[] nums , boolean[] flag , int k , int subset , int curSubset , int position)
{
if(k == 0)
{
return true;
}
if(subset == curSubset)
{
return dfs(nums,flag,k-1,subset,0,0);
}
for(int i = position ; i<nums.length ; i++)
{
if(flag[i])
{
continue;
}
flag[i] = true;
if(dfs(nums,flag,k,subset,curSubset+nums[i],i+1))
{
return true;
}
flag[i] = false;//记得回溯!!!!
}
return false;
}
}