【前端er每日算法】一道面试题

113 阅读1分钟

题目

今天在leetcode上看到一道题:leetcode.cn/circle/disc…

image.png

题目就是:数组A中给定可以使用的1~9的数,返回由A数组中的元素组成的小于n的最大数。

思路

一开始没有思路,一看下面的评论,回溯,😯,这样,那能写出来,理了下思路,其实就是找出集合中的所有全排列,跟x比较,记录最大值。

function getMaxVal(arr, limit) {
    let used = [];
    let max = 0;
    let strLimit = '' + limit;
    let limitLen = strLimit.length;
    function getPath(val, level) {
        if (val < limit && val > max) {
            max = val;
        }
        if (level === limitLen) {
            return;
        }
        for (let i = 0; i < arr.length; i++) {
            // if (!used[i]) {
                let cur = arr[i];
                let origin = val;
                val = val * 10 + cur;
                used[i] = true;
                getPath(val, level + 1);
                used[i] = false;
                val = origin;
            // }
        }
    }
    getPath(0, 0);
    return max;
}

getMaxVal([1, 2, 4, 9], 2538);

getMaxVal([1, 2, 4, 9], 1111);

getMaxVal([1, 2, 4, 9], 11111);

getMaxVal([1, 2, 4, 9], 99999);

但是上面的是不是没有任何减枝操作?如何进行减枝?