日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 39. 组合总和 思考分析

發布時間:2023/12/1 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 39. 组合总和 思考分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

    • 1、題目
    • 2、思考分析
    • 3、未經優化代碼
    • 4、剪枝優化

1、題目

給定一個無重復元素的數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。
candidates 中的數字可以無限制重復被選取。

2、思考分析

解空間樹寬度部分即數組 candidates內集合,深度取決于target.
一開始的重復元素理解錯誤了,每層循環都從0開始:
for(int i=0;i<=candidates.size();i++)
這樣是不對的,會產生重復組合。
我們仍然需要采用startindex作為for起始位置,不過對于下一層我們的startindex不是startindex+1,而是仍然是startindex,這樣才能重復取相同元素。

圖1 for從0開始 圖2 for從i開始

3、未經優化代碼

class Solution { public:vector<vector<int>> result;vector<int> res;int sum;void clear_solution_param(){result.clear();res.clear();sum=0;}void backtracking(vector<int>& candidates,int startindex,int n){ if(sum > n) return;if(sum == n){result.push_back(res);return;}for(int i=startindex;i<candidates.size();i++){//處理結點;res.push_back(candidates[i]);sum+=candidates[i];//遞歸,探索下一層backtracking(candidates,i,n); //遞歸sum-=candidates[i];//回溯,撤銷處理結果res.pop_back();}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {clear_solution_param();backtracking(candidates,0,target);return result;} };

4、剪枝優化

先對數組進行排序,這樣集合元素排列就是有序的了,方便剪枝。(這個在回溯法中經常用到)
對于同一層的for循環,如果sum加上此時的候選元素的和大于target則沒有必要繼續深入下去了。

class Solution { public:vector<vector<int>> result;vector<int> res;int sum;void clear_solution_param(){result.clear();res.clear();sum=0;}void backtracking(vector<int>& candidates,int startindex,int n){ if(sum > n) return;if(sum == n){result.push_back(res);return;}for(int i=startindex;i<candidates.size();i++){//由于輸入的數組是有序的,所以直接進行剪枝。如果sum加上這個集合元素大于目標,此層就不需要往后看了,因為后面的元素加上sum肯定大于目標if(sum+candidates[i]>n) break;//處理結點;res.push_back(candidates[i]);sum+=candidates[i];//遞歸,探索下一層backtracking(candidates,i,n); //遞歸sum-=candidates[i];//回溯,撤銷處理結果res.pop_back();}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {clear_solution_param();//排序加速剪枝sort(candidates.begin(),candidates.end());backtracking(candidates,0,target);return result;} };

總結

以上是生活随笔為你收集整理的leetcode 39. 组合总和 思考分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。