leetcode Day13 回溯

70 阅读1分钟

868. 二进制间距

var binaryGap = function(n) {
    let s=n.toString(2)
    let res=[0]
    let ans=0
    for(let i=1;i<s.length;i++){
        if(s[i]==='1'){
            res.push(i)
            ans=ans>i-res[res.length-2]?ans:i-res[res.length-2]
        }
    }
    return ans
};

模板:

const backtracking=function(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

77. 组合

let result=[]
let path=[]
var combine = function(n, k) {
    result=[]
    combineHelper(n,k,1)
    return result
};
const combineHelper=(n,k,startIndex)=>{
    if(path.length===k){
        result.push([...path])
        return
    }
    for(let i=startIndex;i<=n;i++){
        path.push(i)
        combineHelper(n,k,i+1)
        path.pop()
    }
}

216. 组合总和 III

var combinationSum3 = function(k, n) {
    let res=[]
    let path=[]
    const helper=function(k,n,startIndex,sum){
        if(path.length===k && sum===n){
            res.push([...path])
            return
        }
        for(let i =startIndex;i<=9;i++){
            path.push(i)
            sum+=i
            helper(k,n,i+1,sum)
            sum-=i
            path.pop()
        }
    }
    helper(k,n,1,0)
    return res
};

17. 电话号码的字母组合

var letterCombinations = function(digits) {
    if(digits.length===0)return []
    const letters=['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
    let res=[]
    let path=[]
    let n=digits.length
    const helper=function(n,s,a){
        if(path.length===n){
            res.push(path.join(''))
            return
        }
        for(let v of letters[s[a]]){
            path.push(v)
            helper(n,s,a+1)
            path.pop(v)
        }
    }
    helper(n,digits,0)
    return res
};