建设网站程序下载,软件外包学院大学承认吗,微网站建设价格,乡镇网站建设39.组合总和
分析#xff1a;同一个数可以选多次#xff0c;但是不能有重复的答案#xff1b;
思路#xff1a;横向遍历#xff0c;纵向递归#xff08;不同的是递归的时候不需要跳到下一个位置#xff0c;因为同一个数可以选多次#xff09;
class Solution {
publ…39.组合总和
分析同一个数可以选多次但是不能有重复的答案
思路横向遍历纵向递归不同的是递归的时候不需要跳到下一个位置因为同一个数可以选多次
class Solution {
public:vectorvectorintres;vectorintmids;void backtrace(vectorintcandidates,int start,int sum,int target){if(sumtarget){//终止条件if(sumtarget)//目标条件res.push_back(mids);return;}for(int istart;icandidates.size();i){mids.push_back(candidates[i]);sumcandidates[i];backtrace(candidates,i,sum,target);//因为同一个数可以选多次所以递归为imids.pop_back();sum-candidates[i];}}vectorvectorint combinationSum(vectorint candidates, int target) {backtrace(candidates,0,0,target);return res;}
}; 40.组合总和||
思路重点在于去重
去重树层去重需要在递归遍历的时候判断是否重复
class Solution {
public:vectorvectorintres;vectorintmids;void backtrace(vectorintcandidates,int startIndex,int sum,int target,vectorboolused){if(sumtarget){res.push_back(mids);return;}//剪枝for(int istartIndex;icandidates.size() sumcandidates[i]target;i){if(i0 candidates[i]candidates[i-1] used[i-1]false)//树层去重continue;mids.push_back(candidates[i]);sumcandidates[i];used[i]true;backtrace(candidates,i1,sum,target,used);used[i]false;mids.pop_back();sum-candidates[i];}}vectorvectorint combinationSum2(vectorint candidates, int target) {sort(candidates.begin(),candidates.end());vectorboolused(candidates.size(),false);backtrace(candidates,0,0,target,used);return res;}
}; 131.分割回文串
思路分割字符串然后多了一个判断是否回文的操作
class Solution {
public:vectorvectorstringres;vectorstringmids;bool judge(const string s,int left,int right){while(leftright){if(s[left]!s[right]) return false;left;right--;}return true;}void backtrace(strings,int startIndex){if(startIndexs.size()){res.push_back(mids);return;}for(int istartIndex;is.size();i){if(!judge(s,startIndex,i)) continue;//判断是否回文串string strs.substr(startIndex,i-startIndex1);mids.push_back(str);backtrace(s,i1);mids.pop_back();}}vectorvectorstring partition(string s) {backtrace(s,0);return res;}
};
78.子集
画图分析 思路横向遍历每次遍历的时候都进行一次添加然后进行纵向递归递归完之后进行回溯。
注意空集也是子集。所有节点都需要添加
class Solution {
public:vectorvectorintres;vectorintmid;void backtrace(vectorintnums,int start){res.push_back(mid);if(startnums.size()){//res.push_back(mid);return;}for(int istart;inums.size();i){mid.push_back(nums[i]);backtrace(nums,i1);mid.pop_back();}}vectorvectorint subsets(vectorint nums) {backtrace(nums,0);return res;}
};
90.子集||
分析和上题一样区别在于有重复数字
思路组合问题有重复都考虑先排序再操作
class Solution {
public:vectorvectorintres;vectorintmid;void backtrace(vectorintnums,int start){if(find(res.begin(),res.end(),mid)res.end())//去重res.push_back(mid);if(startnums.size())return;for(int istart;inums.size();i){mid.push_back(nums[i]);backtrace(nums,i1);mid.pop_back();}}vectorvectorint subsetsWithDup(vectorint nums) {sort(nums.begin(),nums.end());//需要排序backtrace(nums,0);return res;}
};
491.递增子序列
思路重点在于set去重以及递增条件
class Solution {
public:vectorvectorintmidRes,res;vectorintmid;void backtrace(vectorintnums,int start){if(mid.size()2 ){//条件限制midRes.push_back(mid);}if(startnums.size())//终止条件return;unordered_setint vistedSet;for(int istart;inums.size();i){if(vistedSet.find(nums[i])!vistedSet.end())//去重continue;if(!mid.empty() mid.back()nums[i])//递增条件continue;//judge[nums[i]]true;vistedSet.insert(nums[i]);//遍历标记mid.push_back(nums[i]);backtrace(nums,i1);mid.pop_back();//回溯}}vectorvectorint findSubsequences(vectorint nums) {backtrace(nums,0);return midRes;}
};
46.全排列
思路跟子集的代码几乎一样主要区别在于 每次遍历都从0开始并且做树枝去重
class Solution {
public:vectorvectorintres;vectorintmid;void backtrace(vectorintnums,int start){if(startnums.size()){res.push_back(mid);}for(int i0;inums.size();i){if(find(mid.begin(),mid.end(),nums[i])!mid.end())//树枝去重continue;mid.push_back(nums[i]);backtrace(nums,start1);mid.pop_back();}}//树枝去重vectorvectorint permute(vectorint nums) {backtrace(nums,0);return res;}
};
47.全排列||
思路一使用哈希表进行树枝下标去重因为有重复元素
问题在数组去重时时间复杂度过高
class Solution {
public:vectorvectorintres;vectorintmid;unordered_mapint,boolmap;void backtrace(vectorintnums,int start){if(startnums.size()){if(find(res.begin(),res.end(),mid)res.end())//数组去重res.push_back(mid);return;}for(int i0;inums.size();i){if(map[i])//树枝去重continue;mid.push_back(nums[i]);map[i]true;backtrace(nums,start1);mid.pop_back();map[i]false;}}vectorvectorint permuteUnique(vectorint nums) {//sort(nums.begin(),nums.end());backtrace(nums,0);return res;}
};
323.重新安排行程
思路首先记录航班的映射关系然后从起点开始根据映射关系一一添加横向遍历纵向递归
注意 起点航班要先添加 如果添加的路线等于航班数1时说明已经走完全部航班如五个航班必然是六个站点 递归深入的时候需要判断当前映射关系是否被添加过
class Solution {
public:unordered_mapstring,mapstring,inttargets;vectorstringmidres;bool backtrace(vectorvectorstring tickets){if(midres.size()tickets.size()1)//航班已经走完的终止条件return true;for(pairconst string,inttarget:targets[midres[midres.size()-1]]){//遍历映射关系if(target.second0){//当映射关系还存在时midres.push_back(target.first);target.second--;if(backtrace(tickets)) return true;//已经找到一条路线midres.pop_back();target.second;}}return false;}vectorstring findItinerary(vectorvectorstring tickets) {midres.push_back(JFK);//先添加起点航班for(auto it:tickets)targets[it[0]][it[1]];//记录映射关系backtrace(tickets);return midres;}
};
51.N皇后
思路二维数组行递归列遍历
在列放置皇后的时候要进行有效判断
1.判断列方向上有没有放置过行方向是递归遍历进行的所以只可能放置一个2.判断左上方有没有放置过3.判断右上方有没有放置过左下方和右下方还没有遍历到无需遍历
class Solution {
public:vectorvectorstringres;bool isvald(int row,int lie,vectorstringmids,int n){//检查列for(int i0;irow;i){if(mids[i][lie]Q)return false;}//检查左上方for(int irow-1,jlie-1;i0 j0;i--,j--){if(mids[i][j]Q)return false;}//检查右上方for(int irow-1,jlie1;i0 jn;i--,j){if(mids[i][j]Q)return false;}return true;}void backtrace(vectorstringmids,int n,int row){if(rown){res.push_back(mids);return;}for(int i0;in;i){//列的遍历if(isvald(row,i,mids,n)){//判断该位置是否有效mids[row][i]Q;backtrace(mids,n,row1);//传入的是下一行不是下一列mids[row][i].;}}}vectorvectorstring solveNQueens(int n) {vectorstringmids(n,string(n,.));//二维数组初始化backtrace(mids,n,0);return res;}
};
37.解数独
思路二维遍历递归判断
class Solution {
public:bool backtrace(vectorvectorcharboard){for(int i0;iboard.size();i){//遍历行for(int j0;jboard[0].size();j){//遍历列if(board[i][j].){for(char k1;k9;k){if(isValid(i,j,k,board)){board[i][j]k;if(backtrace(board)) return true;board[i][j].;}}return false;//9个数都遍历完都不对说明这个位置无法插入}}}return true;//遍历完没有返回false说明完全ok}bool isValid(int row,int col,char val,vectorvectorcharboard){for(int i0;i9;i){//判断行里是否重复if(board[row][i]val) return false;}//判断列里是否重复for(int i0;i9;i){if(board[i][col]val) return false;}//判断九宫格里是否重复int startRow(row/3)*3;//得到的是九宫格内的起始坐标int startCol(col/3)*3;for(int istartRow;istartRow3;i){for(int jstartCol;jstartCol3;j){if(board[i][j]val) return false;}}return true;}void solveSudoku(vectorvectorchar board) {backtrace(board);}
};
文章转载自: http://www.morning.jkrrg.cn.gov.cn.jkrrg.cn http://www.morning.sqqdy.cn.gov.cn.sqqdy.cn http://www.morning.fksxs.cn.gov.cn.fksxs.cn http://www.morning.yrxcn.cn.gov.cn.yrxcn.cn http://www.morning.nqbkb.cn.gov.cn.nqbkb.cn http://www.morning.dbxss.cn.gov.cn.dbxss.cn http://www.morning.rfyff.cn.gov.cn.rfyff.cn http://www.morning.qqhersx.com.gov.cn.qqhersx.com http://www.morning.mnjwj.cn.gov.cn.mnjwj.cn http://www.morning.mrcpy.cn.gov.cn.mrcpy.cn http://www.morning.kqpq.cn.gov.cn.kqpq.cn http://www.morning.pnjsl.cn.gov.cn.pnjsl.cn http://www.morning.hjwxm.cn.gov.cn.hjwxm.cn http://www.morning.sjwqr.cn.gov.cn.sjwqr.cn http://www.morning.tsxg.cn.gov.cn.tsxg.cn http://www.morning.nypgb.cn.gov.cn.nypgb.cn http://www.morning.sypzg.cn.gov.cn.sypzg.cn http://www.morning.pngfx.cn.gov.cn.pngfx.cn http://www.morning.kjyfq.cn.gov.cn.kjyfq.cn http://www.morning.rqjfm.cn.gov.cn.rqjfm.cn http://www.morning.nckzt.cn.gov.cn.nckzt.cn http://www.morning.txkrc.cn.gov.cn.txkrc.cn http://www.morning.kscwt.cn.gov.cn.kscwt.cn http://www.morning.nynyj.cn.gov.cn.nynyj.cn http://www.morning.mtyhk.cn.gov.cn.mtyhk.cn http://www.morning.rzsxb.cn.gov.cn.rzsxb.cn http://www.morning.srwny.cn.gov.cn.srwny.cn http://www.morning.lclpj.cn.gov.cn.lclpj.cn http://www.morning.ckhyj.cn.gov.cn.ckhyj.cn http://www.morning.yesidu.com.gov.cn.yesidu.com http://www.morning.mhnb.cn.gov.cn.mhnb.cn http://www.morning.xkmrr.cn.gov.cn.xkmrr.cn http://www.morning.lssfd.cn.gov.cn.lssfd.cn http://www.morning.c7625.cn.gov.cn.c7625.cn http://www.morning.dmxzd.cn.gov.cn.dmxzd.cn http://www.morning.rqbkc.cn.gov.cn.rqbkc.cn http://www.morning.wgqtt.cn.gov.cn.wgqtt.cn http://www.morning.qgqck.cn.gov.cn.qgqck.cn http://www.morning.tldfp.cn.gov.cn.tldfp.cn http://www.morning.qfwzm.cn.gov.cn.qfwzm.cn http://www.morning.yznsx.cn.gov.cn.yznsx.cn http://www.morning.sqfnx.cn.gov.cn.sqfnx.cn http://www.morning.hjlwt.cn.gov.cn.hjlwt.cn http://www.morning.hxxyp.cn.gov.cn.hxxyp.cn http://www.morning.rtjhw.cn.gov.cn.rtjhw.cn http://www.morning.bhdtx.cn.gov.cn.bhdtx.cn http://www.morning.xkgyh.cn.gov.cn.xkgyh.cn http://www.morning.yllym.cn.gov.cn.yllym.cn http://www.morning.dcpbk.cn.gov.cn.dcpbk.cn http://www.morning.nsrlb.cn.gov.cn.nsrlb.cn http://www.morning.gwjnm.cn.gov.cn.gwjnm.cn http://www.morning.nyqb.cn.gov.cn.nyqb.cn http://www.morning.ygqhd.cn.gov.cn.ygqhd.cn http://www.morning.fktlr.cn.gov.cn.fktlr.cn http://www.morning.lphtm.cn.gov.cn.lphtm.cn http://www.morning.rmxgk.cn.gov.cn.rmxgk.cn http://www.morning.xwbwm.cn.gov.cn.xwbwm.cn http://www.morning.nqcts.cn.gov.cn.nqcts.cn http://www.morning.mgkb.cn.gov.cn.mgkb.cn http://www.morning.dkqr.cn.gov.cn.dkqr.cn http://www.morning.hrzky.cn.gov.cn.hrzky.cn http://www.morning.ydxg.cn.gov.cn.ydxg.cn http://www.morning.mxlmn.cn.gov.cn.mxlmn.cn http://www.morning.kpqjr.cn.gov.cn.kpqjr.cn http://www.morning.flxqm.cn.gov.cn.flxqm.cn http://www.morning.ltcnd.cn.gov.cn.ltcnd.cn http://www.morning.frzdt.cn.gov.cn.frzdt.cn http://www.morning.fmtfj.cn.gov.cn.fmtfj.cn http://www.morning.clyhq.cn.gov.cn.clyhq.cn http://www.morning.cmdfh.cn.gov.cn.cmdfh.cn http://www.morning.myzfz.com.gov.cn.myzfz.com http://www.morning.rfyk.cn.gov.cn.rfyk.cn http://www.morning.ltksw.cn.gov.cn.ltksw.cn http://www.morning.wqjpl.cn.gov.cn.wqjpl.cn http://www.morning.kqxwm.cn.gov.cn.kqxwm.cn http://www.morning.bchfp.cn.gov.cn.bchfp.cn http://www.morning.xsqbx.cn.gov.cn.xsqbx.cn http://www.morning.trrd.cn.gov.cn.trrd.cn http://www.morning.wgtnz.cn.gov.cn.wgtnz.cn http://www.morning.cwrpd.cn.gov.cn.cwrpd.cn