2026/1/27 22:58:45
网站建设
项目流程
集团公司门户网站建设,汕头人事考试网,区域网址ip查询,企业网站 案例回溯
1.理论基础
递归下面就是回溯。
回溯搜索法#xff0c;其实是一个纯暴力搜索。
回溯解决的问题#xff1a;组合问题#xff0c;切割问题#xff0c;子集问题#xff0c;排列问题#xff0c;棋盘问题
递归函数没有返回值#xff0c;终止条件单层搜索逻辑#…回溯1.理论基础递归下面就是回溯。回溯搜索法其实是一个纯暴力搜索。回溯解决的问题组合问题切割问题子集问题排列问题棋盘问题递归函数没有返回值终止条件单层搜索逻辑for循环处理集合元素回溯void backtracking(/*参数*/) { if (/*终止条件*/) { //存放结果; return; } for (/*选择本层集合中元素树中节点孩子的数量就是集合的大小*/) { //处理节点; //backtracking(路径选择列表); // 递归 //回溯撤销处理结果 } }2.组合问题77. 组合 - 力扣LeetCode递归函数参数 返回值终止条件单层递归逻辑classSolution{ListListIntegeransnewArrayList();voidbackTrace(ListIntegertmp,inti,intn,intk){if(tmp.size()k)//终止条件{ans.add(newArrayList(tmp));return;}for(intji;jn;j){tmp.add(j);backTrace(tmp,j1,n,k);tmp.remove(tmp.size()-1);}}publicListListIntegercombine(intn,intk){//其实就是从大到小 然后每次pop 再进他后面的ListIntegertmpnewArrayList();backTrace(tmp,1,n,k);returnans;}}3.组合问题的剪枝操作上面那个题目可以进行剪枝这样往下的深度就不会那么多了。这样就是一个树里可以走到所有值jn-(k-tmp.size())1*4.组合总和216. 组合总和 III - 力扣LeetCodeclassSolution{ListListIntegeransnewArrayList();voidbacktracing(ListIntegertmp,inti,intk,intn){if(tmp.size()k){if(n0)ans.add(newArrayList(tmp));//不管是不是想要的值都要进行返回了 不然不会popreturn;}//进行剪枝for(intji;j10jn;j){tmp.add(j);backtracing(tmp,j1,k,n-j);tmp.remove(tmp.size()-1);}}publicListListIntegercombinationSum3(intk,intn){ListIntegertmpnewArrayList();backtracing(tmp,1,k,n);returnans;}}5.电话号码的字母组合17. 电话号码的字母组合 - 力扣LeetCodeclassSolution{//模板privatestaticfinalString[]MAPPINGnewString[]{,,abc,def,ghi,jkl,mno,pqrs,tuv,wxyz};privatevoiddfs(ListStringans,inti,char[]digits,char[]path){if(idigits.length){//到达终止条件ans.add(newString(path));return;}StringlettersMAPPING[digits[i]-0];for(charc:letters.toCharArray()){path[i]c;dfs(ans,i1,digits,path);//往后继续递归}}publicListStringletterCombinations(Stringdigits){intndigits.length();if(n0){returnList.of();//直接返回空}ListStringansnewArrayList();//看一下是怎么声明char数组的char[]pathnewchar[n];dfs(ans,0,digits.toCharArray(),path);returnans;}}*6.组合总和39. 组合总和 - 力扣LeetCode相较于之前元素可以重复使用所以剩余集合就是可以一直往下。但是要排除掉大于的东西。classSolution{ListListIntegerans;ListIntegerpath;publicvoiddfs(inti,inttarget,int[]candidates){if(icandidates.length){return;//现在已经全部弄完了}if(target0){//已经到达最终结果了ans.add(newArrayList(path));return;}//可以直接不选dfs(i1,target,candidates);//剪枝进行选择if(target-candidates[i]0){path.add(candidates[i]);//因为可以重复选择 所以还是从当前元素开始dfs(i,target-candidates[i],candidates);path.remove(path.size()-1);//回退}}publicListListIntegercombinationSum(int[]candidates,inttarget){this.ansnewArrayList();this.pathnewArrayList();dfs(0,target,candidates);returnans;}}*7.组合总和240. 组合总和 II - 力扣LeetCodeclassSolution{ListListIntegeransnewArrayList();ListIntegerpathnewArrayList();//只能出现一次 所以每次只能往后加publicvoiddfs(inti,inttarget,int[]candidates){if(target0){ans.add(newArrayList(path));return;}//开始往后进行for(intji;jcandidates.length;j){//剪枝if(target-candidates[j]0){System.out.println(i);//排除掉重复的部分if(jicandidates[j]candidates[j-1]){continue;}//可以继续往下进行操作path.add(candidates[j]);dfs(j1,target-candidates[j],candidates);path.remove(path.size()-1);}}}publicListListIntegercombinationSum2(int[]candidates,inttarget){Arrays.sort(candidates);dfs(0,target,candidates);returnans;}}*8.分割回文串131. 分割回文串 - 力扣LeetCode先判断前面的对不对 再往后继续加classSolution{ListListStringansnewArrayList();ListStringpathnewArrayList();publicbooleanisP(Strings,inta,intb){while(ab){if(s.charAt(a)!s.charAt(b--)){returnfalse;}}returntrue;}publicvoidbackTracing(inti,Strings){//切割完成if(is.length()){ans.add(newArrayList(path));return;}for(intji;js.length();j){if(isP(s,i,j)){path.add(s.substring(i,j1));//分割backTracing(j1,s);path.removeLast();}}}publicListListStringpartition(Strings){backTracing(0,s);returnans;}}9.复原IP地址93. 复原 IP 地址 - 力扣LeetCodeclassSolution{//其实就是分割成四个有效的数字ListStringansnewArrayList();//记录数的集合ListListIntegerresnewArrayList();ListIntegerpathnewArrayList();//判断加上当前数是否能组成新的合法数publicbooleanisValid(Strings,intstart,intend){intlenend-start1;if(len1||len3){returnfalse;}//第一个数不能为0if(len1s.charAt(start)0){returnfalse;}intnumInteger.parseInt(s.substring(start,end1));returnnum255;}publicvoidbackTracing(inti,Strings){if(path.size()4){if(is.length()){res.add(newArrayList(path));}return;}if(s.length()-i(4-path.size())*3)//剩余字符过多{return;}if(s.length()-i(4-path.size()))//过少{return;}for(intji;js.length()ji3;j){//继续叠加if(isValid(s,i,j)){//parseIntintnumInteger.parseInt(s.substring(i,j1));path.add(num);backTracing(j1,s);path.removeLast();}}}publicListStringrestoreIpAddresses(Strings){if(s.length()4||s.length()12){returnans;}backTracing(0,s);for(ListIntegernums:res){//里面还是一个数的数组StringBuildersbnewStringBuilder();for(inti0;i4;i){sb.append(nums.get(i));// 每两个元素之间加 .最后一个元素后不加if(i!nums.size()-1){sb.append(.);}}ans.add(sb.toString());}returnans;}}10.子集78. 子集 - 力扣LeetCodeclassSolution{ListListIntegeransnewArrayList();ListIntegerpathnewArrayList();publicvoidbackTracing(intidx,int[]nums){ans.add(newArrayList(path));//不管怎么样上来就先直接放进去for(intiidx;inums.length;i){path.add(nums[i]);backTracing(i1,nums);path.remove(path.size()-1);}}publicListListIntegersubsets(int[]nums){backTracing(0,nums);returnans;}}该死的回溯…