前言:如果你做出來了39題,但是遇到40題就不會做了,那我建議你去再好好縷清39題的思路,再來看這道題,會有種豁然開朗的感覺
解題思路:這道題其實與39題基本一致,所以本次題解是借著39題為基礎來講解的40題,故,看本次題解的前提是,會了39題
? ? ? ? 1.獲取信息:????????
? ? ? ? ? ? ? ? 與39題唯一的區別就是:
? ? ? ? ? ? ? ? (1)數組里面的數字不能在同一個組合中重復使用了
? ? ? ? ? ? ? ? (2)數組中會出現重復的數字了
? ? ? ? 2.分析題目:
? ? ? ? ? ? ? ? 與39題相比,只是變更了幾個影響不大的條件,它的根本并沒有改變,所以只需要對39題的代碼進行適當修改就行了
? ? ? ? ? ? ? ? 只需要把39題的代碼中的,重復取同一個數字的步驟給去掉,再進行一些微調即可
? ? ? ? 3.示例查驗:略
? ? ? ? 4.嘗試編寫代碼:
? ? ? ? ? ? ? ? (1)39題優化后的代碼,再進行一些步驟上的修改
? ? ? ? ? ? ? ? ? ? ? ? 思路:本次就辛苦你直接看代碼及其注釋,并且,好好對比一下,上一題和下一題的代碼,我改了哪些東西
class Solution {
public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<int>cand(51,0);//這里修改成了存儲int類型,而不是bool類型for(int&c:candidates){cand[c]++;}vector<int>path;vector<vector<int>>res;reBack(res,path,cand,target,1);return res;}
private:void reBack(vector<vector<int>>&res,vector<int>&path,vector<int>&cand,int les,int i){if(les==0){res.push_back(path);return;}for(i;i<=les;i++){if(i>les)return;if(cand[i]){path.push_back(i);cand[i]--;//多出來的步驟reBack(res,path,cand,les-i,i);cand[i]++;//多出來的步驟path.pop_back();}}}
};
本次題解到這里就完了,接下來絕對不會斷更,暑假的時候可以期待一下哦
還是要動手寫一寫,不要只看題解
還是說,紙上得來終覺淺,絕知此事要躬行