N-sum问题通解
· 阅读需 4 分钟
N-sum 问题还是比较典型的,这里进行一下小结。
首先描述一下 N-sum 问题:有一个数组 nums,要求从数组中选择 n 个数,使得这些数的和恰好为 target ,输出所有不重复的可行组合。
如果采用暴力解法,显然时间复杂度为 ,这一般是不可取的。
下面是 N-sum 问题的LeeCode链接:
Two-Sum
先来解决Two-Sum问题,这是N-sum问题的基础。如果我们能把Two-Sum的时间复杂度降为 ,然后就能把N-sum的时间复杂度降为 了。
如果采用暴力解法,每次选择一个数时,都要遍历数组来选择另一个数,并判断和是否为 target,这样显然是低效的。当我们选择一个数 x 时,我们希望数组里有一个数为 target - x。为了快速判断数组里是否有某个数,可以用 HashSet。但是,这样存在问题,因为数组里可能有重复的数,当 x 等于 target - x 时,这种做法就错了。因此,正确的做法应该是用 HashMap,用来存储各个数还有多少可用。