最近看面经,有人在字节跳动的面试中,手写这道题,但是发现是 LeetCode 上的原题,所以记录下来。
题目:给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
示例 1:
输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。
注意:
1 <= k <= len(nums) <= 16
0 < nums[i] < 10000
-
分析
前提:需要先明确一个问题,一个数组能够划分出 k 个和相等子集的前提是:这个数组的平均数必须是整数。
典型的递归问题:现在总的数组中找到一个子集,再在剩下的数组元素中找到一个子集...直到所有子集都找到,结束递归。
求解步骤:
1、先求出数组的平均数 avg,如果平均数 avg 不为整数,也就是说数组的数字总和不能平均的分为 k 份