Partition to K Equal Sum Subsets——LeetCode进阶路
生活随笔
收集整理的這篇文章主要介紹了
Partition to K Equal Sum Subsets——LeetCode进阶路
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原題鏈接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;
}
}
總結
以上是生活随笔為你收集整理的Partition to K Equal Sum Subsets——LeetCode进阶路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在CentOS 7虚拟机上正确安装Red
- 下一篇: codeup之C语言10.10