我们继续研究算法面试题型中最复杂的动态规划类型。题目如下:给定一个含有正整数的数组,请给出算法将其分成两个子数组,使得他们的元素和相等。例如给定数组[2,3, 5, 6],它可以分割成两个数组[2,6],[3,5],两个字数组的和都是8.
在面试中遇到问题时,我们首先需要对其中一些模糊之处进行澄清,这样我们才能给面试官思维周全和谨慎的好印象。对于这个问题,我们需要搞清楚的问题又,数组是否为空?数组最多包含多少元素等。清除掉这些模糊点再下手,这样成功率才会更大。
根据前面说过的动态规划解决套路,问题的思考模式为:首先缩小问题规模,看看解决更小规模的问题后,能不能通过其结果来解决更大规模的问题。例如给定的问题中输入数组包含n个元素,那么我们先思考能不能解决n-1个元素情况下的问题,如果能解决,如何利用其结果来解决n个元素的问题。其次一定要利用缓存来存储中间问题的答案,在递归的解决更小规模问题时,先从缓存中查找,如果没有结果在进行下一步的处理。
我们把题目里面的元素增加一些有利于讨论,假设数组为[14, 6, 7, 2, 3, 5, 7],我们将其分成两部分,使得两部分元素之和相等。首先从肉眼上不难看出两部分子数组为:
part1 : 14, 3, 5
part2: 6, 7, 2, 7
现在我们看看如何将问题的规模进行缩小。假设我们去掉数组最后一个元素7,那么两部分数组变成:
part1: 14, 3, 5
part2: 6, 7, 2,
不难发现此时两个数组的元素和的差值为7,这意味着当数组元素为n时,我们要找到两个子数组使得他们元素和的差值为0,如果拿掉最后一个元素,我们用last_element表示,那么问题变成从包含n-1个元素的数组中找到两子数组,使得他们的差值为last_element,如果我们从包含n-1个元素的数值中找到给定分组,那么我们把拿掉的元素放入到元素和较小的那个分组中,这样我们就得到在n个元素下的两个子数组,使得他们元素和相等。
我们再往下看,如果我们再上面问题基础上再进行规模缩小,拿掉最后一个元素5,那么分组变成:
part1: 14, 3
part2: 6,7,2
于是问题变成当数组包