Leetcode 面试题16.11 跳水版

176 阅读1分钟

本人拿到这道题的初步想法是很愚蠢的,思路如下:使用递归求解,参数有总数k,当前数量n,总和sum,结果集res,分别加longer或shorter,每次判断层级并分别累加sum。当n==k,将sum装入结果集,最后排序。

参考题解解答后,发现自己忽略了显而易见的条件:
1.sum = i*longer + (k-i)*shorter
2.i从0-k循环,结果依次增大

解法一:循环即可

    //k不存在,返回空集
    if(!k) return [];
    //两板相等,结果唯一
    if(shorter == longer) return[shorter*k];
    const res = [];
    //注意终止条件i<=k
    for(let i = 0 ; i <= k ; i++){
        res.push(i*longer + (k-i)*shorter);
    }
    return res;

解法二:递归(本质一样,看起来骚一点)

    //特殊情况同上
    if(!k) return [];
    if(shorter == longer) return[shorter*k];
    
    const dfs = function(shorter, longer ,k , i ,res){
        //终止条件i>k
        if(i>k) return res;
        res.push(i*longer + (k-i)*shorter);
        //递归调用,i+1
        return dfs(shorter, longer,k ,i+1 ,res);
    }
    
    return dfs(shorter, longer ,k ,0 ,[]);