LeetCode第39題之Combination Sum(兩種方法)
思路:兩種方法都是利用遞歸回溯,第二方法在第一種方法的基礎上對原始資料先進行排序,這樣可以剪枝,加快計算速度。第一種方法在LeetCode上測試執行的時間是24ms,第二種方法執行時間為16ms。
方法一:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
class Solution {
private:
//res儲存滿足題意的結果
vector<vector<int>> res;
//儲存當前的一種方案
vector<int> method;
public:
void getCombinationSum(int start, int sum, int target, vector<int> &candidates)
{
//因為canditates經過排序,所以如果sum>target
if (sum > target)
{
return;
}
//如果滿足題意則儲存結果
else if (sum == target)
{
res.push_back(method);
return;
}
else
{
for(int i=start;i<candidates.size();++i)
{
//芳第i件物品
method.push_back(candidates[i]);
getCombinationSum(i, sum+candidates[i], target, candidates);
//回溯,去除第i件物品,然後繼續放第i+1個數
method.pop_back();
}
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
int sum = 0;
getCombinationSum(0, 0, target, candidates);
return res;
}
};
int main()
{
Solution s;
vector<int> canditates;
canditates.push_back(2);
canditates.push_back(7);
canditates.push_back(3);
canditates.push_back(6);
vector<vector<int>> res = s.combinationSum(canditates, 7);
//列印結果
for (vector<vector<int>>::iterator ita=res.begin();ita!=res.end();++ita)
{
for (vector<int>::iterator itb=ita->begin();itb!=ita->end();++itb)
{
cout<<*itb<<'\t';
}
cout<<endl;
}
cout<<endl;
return 0;
}
方法二:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
class Solution {
private:
//res儲存滿足題意的結果
vector<vector<int>> res;
//儲存當前的一種方案
vector<int> method;
public:
void getCombinationSum(int start, int sum, int target, vector<int> &candidates)
{
for(int i=start;i<candidates.size();++i)
{
//放第i個數,如果第i個數放進去之後超過了target,則剪枝(直接返回),因為candidates經過排序,換成後面的數放進去的話肯定也會超過target
if (sum+candidates[i] > target)
{
return;
}
//如果滿足則儲存結果
else if (sum+candidates[i] == target)
{
method.push_back(candidates[i]);
res.push_back(method);
method.pop_back();
return;
}
//如果放第i個數後不超過target,則將第i個數放入
else
{
method.push_back(candidates[i]);
getCombinationSum(i, sum+candidates[i], target, candidates);
//回溯,去除第i個數,然後繼續放第i+1個數
method.pop_back();
}
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
int sum = 0;
//排序
sort(candidates.begin(), candidates.end());
getCombinationSum(0, 0, target, candidates);
return res;
}
};
int main()
{
Solution s;
vector<int> canditates;
canditates.push_back(2);
canditates.push_back(7);
canditates.push_back(3);
canditates.push_back(6);
vector<vector<int>> res = s.combinationSum(canditates, 7);
for (vector<vector<int>>::iterator ita=res.begin();ita!=res.end();++ita)
{
for (vector<int>::iterator itb=ita->begin();itb!=ita->end();++itb)
{
cout<<*itb<<'\t';
}
cout<<endl;
}
cout<<endl;
return 0;
}
相關推薦
LeetCode第39題之Combination Sum(兩種方法)
思路:兩種方法都是利用遞歸回溯,第二方法在第一種方法的基礎上對原始資料先進行排序,這樣可以剪枝,加快計算速度。第一種方法在LeetCode上測試執行的時間是24ms,第二種方法執行時間為16ms。 方
LeetCode第29題 Divide Two Integers(兩數相除)
class Solution { public: int divide(int dividend, int divisor) { if(!divisor || (dividend == INT_MIN && divisor == -1)
Android之列印長日誌(兩種方法)
//第一種方式 //列印長的日誌 public static void LongLoge(String str){ int max_str_length=2001-NOTGREENDAO.length(); //大於4000時
執行緒 之 建立(兩種方法)和啟動
java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread 類或者子類的例項。 每個執行緒的任務是完成一定的任務,就是執行一段程式流。 目前有兩種建立方式(第三種後續補充) 一種是繼承Thread類 一種是實現Runnable介面` 一、繼承Thread類 1.定
排序演算法之——歸併排序(兩種方法及其優化)
1 public class MergeX implements Comparable<Merge> {// 歸併排序(優化後) 2 private static Comparable[] aux; 3 4 private static boolean less(C
執行緒 之 建立(兩種方法)和啟動
java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread 類或者子類的例項。 每個執行緒的任務是完成一定的任務,就是執行一段程式流。 目前有兩種建立方式(第三種後續補充) 一種是繼承Thread類 一種是實現Runnable介面` 一、繼承Th
資料結構實驗之圖論八:歐拉回路(兩種方法)
資料結構實驗之圖論八:歐拉回路 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在哥尼斯堡的一個公園裡,有七座橋將普雷格爾河中兩個島及島與河岸連線起來。 能否走過這樣的七
Java小程式之句子每個單詞首字母大寫(兩種方法)
題目:用Java編寫一個將輸入的英文句子每個單詞首字母變為大寫的小程式。 程式碼如下: 檔名:CapitalizeTheFirstLetter.java public class CapitalizeTheFirstLetter { /**
python爬蟲之scrapy中user agent淺談(兩種方法)
user agent簡述 User Agent中文名為使用者代理,簡稱 UA,它是一個特殊字串頭,使得伺服器能夠識別客戶使用的作業系統及版本、CPU 型別、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器外掛等。 開始(測試不同型別user agent返回值) 手機use
eclipse批量替換,修改變量名或單詞(兩種方法)
.com 雙擊 方框 批量 ref lac cnblogs height ima 第一種(常用): ①如圖:雙擊選中變量名id,右鍵選擇Refactor中的Rename ②之後如下圖所示,紅箭頭的帶有方框的就是選中修改的變量名,此時修改提示框的內容,後面帶方框的也
一、查看Linux內核版本命令(兩種方法):
use proc color tex 2.6 distrib oot lin hat 一、查看Linux內核版本命令(兩種方法):1、cat /proc/version[[email protected]CentOS home]# cat /proc/versio
轉載:在ASP.net 3.5中 用JSON序列化對象(兩種方法)
for pep 技術分享 contract arr static returns web memory asp.net3.5中已經集成了序列化對象為json的方法。 1:System.Runtime.Serialization.Json; 2:Syst
java快排(兩種方法)
span ast [] ati pub 方法 color 整體 blog 快排是最基礎的排序算法之一,今天來回顧一下。 public class QuickSort { public static void quickSort(int[] ar
C語言判斷素數(求素數)(兩種方法)(第二種沒看懂Kkkkk有空一定搞明白)(非原創)
素數又稱質數。所謂素數是指除了 1 和它本身以外,不能被任何整數整除的數,例如17就是素數,因為它不能被 2~16 的任一整數整除。 思路1):因此判斷一個整數m是否是素數,只需把 m 被 2 ~ m-1 之間的每一個整數去除,如果都不能被整除,那麼 m 就是一個素數。 思路2):另
最長上升子序列(兩種方法)
常規方法:(n^2) #include<iostream> using namespace std; int i,j,n,a[100],b[100],max; int main() { cin>>n; for(i=0;i<n;i++)
jquery生成二維碼怎麼新增圖片(兩種方法)
自動生成二維碼裡面新增圖片,有兩種方法,一種是使用jquery原生的二維碼外掛,一種是別人有改動過的二維碼外掛,生成二維碼的圖片的時候有那麼一些寫的差別 第一種:使用的是原生的qrcode.js生成二維碼加上圖片 頁面 <div class="ma
輸入字串,逆序輸出(兩種方法)
問題描述 從鍵盤上輸入一組字串,實現逆序輸出。 解題思路 方法一:輸出的時候從(n-1)的資料往前依次輸出。 方法二:假設輸入n個字元,字串預設末尾補上' \0 ',將第0個字元和第(n-1)個字元交換,依次交換中間的資料 輸入的資料 H E
【DP】疊放箱子問題(兩種方法)
題目描述 某港口有一批集裝箱,將其編號,分別為1至N。每一個箱子的外型尺寸都是一樣的,現在要將其中某些集裝箱疊放起來,集裝箱疊放的規則如下: 1)每個集裝箱上最多隻能直接疊放一個集裝箱。 2)編號較小的集裝箱不能放在編號較大的集裝箱之上。 3)每個集裝箱都給出了自身的重量和可
leetcode53:求解最大子序和(兩種方法)
演算法思路和演算法複雜度分析在函式中 public class leetcode_53 { /** * 最大子序列和 * * */ public static void main(String[] args) { //測試第一種
javaSE (二十六)map集合遍歷(兩種方法)、輸入字元,計算字元出現次數(用map實現)、HashMap巢狀HashMap
1、map集合遍歷: map集合沒有iterator方法,所以不能直接迭代 直接看下面的程式碼和第一行的註解(加了註釋之後變黑看不清了,所以前面沒加註釋) 1、map的第一種遍歷:遍歷map的所有值:method1() 獲取所有的鍵的集合:Set<K> keySet()