leetcode Day55 剑指专项 81-84

122 阅读1分钟

剑指 Offer II 081. 允许重复选择元素的组合

var combinationSum = function(candidates, target) {
    let ans=[]
    const dfs=(target,res,idx)=>{
        if(idx===candidates.length){
            return
        }
        if(target===0){
            ans.push(res)
            return
        }
        dfs(target,res,idx+1)
        if(target-candidates[idx]>=0){
            dfs(target-candidates[idx],[...res,candidates[idx]],idx)
        }
        
    }
    dfs(target,[],0)
    return ans
};

剑指 Offer II 082. 含有重复元素集合的组合

var combinationSum2 = function(candidates, target) {
    let ans=[]
    candidates.sort((a,b)=>a-b)
    const dfs=(idx,res,sum)=>{
        if(sum===target){
            ans.push([...res])
            return
        }
        for(let i=idx;i<candidates.length;i++){
            if(sum+candidates[i]>target){
                break
            }
            if(i>idx && candidates[i]===candidates[i-1]){
                continue
            }
            res.push(candidates[i])
            dfs(i+1,res,sum+candidates[i])
            res.pop()
        }
    }
    dfs(0,[],0)
    return ans
};

剑指 Offer II 083. 没有重复元素集合的全排列

var permute = function(nums) {
    let res=[]
    const dfs=(idx,ans)=>{
        if(idx===nums.length){
            res.push(ans)
            return
        }
        for(let i of nums){
            if(ans.indexOf(i)!=-1)continue
            let cur=[...ans,i]
            dfs(idx+1,cur)
        }
    }
    dfs(0,[])
    return res
};

剑指 Offer II 084. 含有重复元素集合的全排列

var permuteUnique = function(nums) {
    let res=[]
    const dfs=(arr,count)=>{
        if(count===nums.length){
            res.push(arr.map(i=>nums[i]))
            return
        }
        const visited=new Set
        for(let i=0;i<nums.length;i++){
            if(arr.includes(i) || visited.has(nums[i]))continue
            visited.add(nums[i])
            arr.push(i)
            dfs(arr,count+1)
            arr.pop()
        }
    }
    dfs([],0)
    return res
};