给定数组,试求能否从数组中取出n个不复用的数的和为sum

这是之前在一次面试中遇到的一道题,当时因为太久没撸算法,太久没刷题,所以gg,现在回顾一下。

问题描述
实现一个函数,传3个参数,指定数组(有小数、正负数),n(取出个数),sum(指定和),输出是否能找到这几个数。

这和经典的凑硬币问题其实本质上是相同的,自然可以用动态规划来做,但这里我们先考虑用深度搜索来做做。

关键就是这些边界的选择设置,我在这里也调了很久,这还是得多练,熟能生巧

边界条件

  • sum=0&n=0,成功get;
  • n<=0,这条路径跪了;
  • n>0,继续搜索->>>

因为数组中有正有负,所以sum只能用于最后的满足判断

处理关键是各种情况都需要有确定的逐层return,因此只要你的考虑周全,边界判断可以灵活改变。

完整代码如下:成功返回true,失败返回false

function findGroup(arr,n,sum){
    if(sum == 0 && n == 0){
        return true;
    }else if(n <= 0){
        return false;
    }
    if(n > 0)
        for(var i = 0; i < arr.length; i++){
            var temp = arr.slice(i+1,arr.length);
            return findGroup(temp,n-1,sum-arr[i]) || findGroup(temp,n,sum);
        }
}

未完…(看算法真是又爽又痛苦,关键是理解)

你可能感兴趣的:(算法)