1. 程式人生 > >LeetCode第39題之Combination Sum(兩種方法)

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;
}

相關推薦

LeetCode39Combination Sum方法

思路:兩種方法都是利用遞歸回溯,第二方法在第一種方法的基礎上對原始資料先進行排序,這樣可以剪枝,加快計算速度。第一種方法在LeetCode上測試執行的時間是24ms,第二種方法執行時間為16ms。 方

LeetCode29 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()