当前位置: 首页 > Web前端 > HTML

39.组合总和-算法(leetode,附思维导图+全解)300题

时间:2023-03-28 14:33:50 HTML

零题:算法(leetode,附思维导图+全解)300题(39)组合和,致力于写极简但完整解(算法)的博主1.题目描述2.解法概览(思维导图)3.所有解法1Scheme11)代码://Scheme1《回溯(本质:递归)法》//技巧:说白了就是穷举所有通过回溯,根据当前情况进行不同的处理。//思路://1)状态初始化//2)调用-回溯//3)返回结果resListvarcombinationSum=function(candidates,target){constdfs=(curIndex,l,curSum,target,curArr,resList)=>{//1)递归退出if(curSum===target){//注意:需要用slice来获取它的复制值!resList.push(curArr.slice());返回;}if(curIndex>=l||curSum>target){返回;}//2)Recursivebody("Core:backtracking=select+notselect")//2.1)ChoosecurSum+=candidates[curIndex];curArr.push(候选人[curIndex]);dfs(curIndex,l,curSum,target,curArr,resList);//2.2)不选择("边界:可能需要恢复环境!")curSum-=candidates[curIndex];curArr.pop();dfs(curIndex+1,l,curSum,target,curArr,resList);};//1)状态初始化constl=candidates.length;让curIndex=0,curSum=0,curArr=[],resList=[];//2)调用-回溯dfs(curIndex,l,curSum,target,curArr,resList);//3)返回结果resultresListreturnresList;};2方案21)代码://方案2《动态编程-普通版》//TODO,注意:通过了0/170,应该是代码哪里错了!!!//思路://1)状态定义://dp[i][j]前i项(使用哨兵从1开始)可以组合成j的序列//2)初始化://dp[0][j]=[],如果没有item,则没有可以组合成j的序列//3)传递方程://从两个方向递归得到dp[i][j]的值://Currentlyavailableitems其中targetj的序列可以不选择第i个item进行组合,即dp[i-1][j]//在当前可选择的item中,选择第i个的k个item第-项,即dp[i-1][j-k*nums[i]]//注意:动态规划数组中的存储是引用,所以需要深拷贝//参考://1)https://leetcode-cn.com/problems/combination-sum/solution/dong-tai-gui-hua-bei-bao-wen-ti-by-sjtxw-11yv/varcombinationSum=function(candidates,target){//1)dp状态初始化constl=candidates.length;constdp=newArray(l+1);for(leti=0;i<=l;i++){dp[i]=newArray(target+1);};for(leti=0;i<=target;i++){dp[0][i]=[];};//2)dp状态转移并处理结果for(leti=1;i<=l;i++){dp[i][0]=[];for(letj=1;j<=target;j++){dp[i][j]=[];for(constitemofdp[i-1][j])dp[i][j].push(Array.from(item));//不选择当前元素for(letk=1;j-k*candidates[i-1]>=0;k++){//选择k个当前元素constpre=j-k*candidates[i-1];if(pre===0){dp[i][j].push(newArray(k).fill(candidates[i-1]));//恰好k个当前元素}else{for(constitemofdp[i-1][pre]){dp[i][j].push(item.concat(newArray(k).fill(candidates[i-1])));}}}}}//3)返回结果dp数组returndp;};3方案31)代码://方案3《动态规划-优化版》//本质:将二维存储空间压缩成一维存储空间//思路://1)dp状态初始化//2)dp状态转移和结果处理//3)返回结果dp[target]varcombinationSum=function(candidates,target){//1)dp状态初始化constl=candidates.length;constdp=newArray(target+1);dp[0]=[];//2)dp状态转移并处理结果for(leti=0;i