国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【leetcode】深搜、暴搜、回溯、剪枝(C++)2

這篇具有很好參考價(jià)值的文章主要介紹了【leetcode】深搜、暴搜、回溯、剪枝(C++)2。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


一、括號生成

1、題目描述

leetcode鏈接
【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

2、代碼

class Solution 
{
public:
    // 1、全局變量
    string path;
    vector<string> ret;
    int right = 0, left = 0, n = 0;
    vector<string> generateParenthesis(int _n) 
    {
        n = _n;
        dfs();
        return ret;
    }
    void dfs()
    {
        // 1、出口
        if(right == n)
        {
            ret.push_back(path);
            return;
        }
        // 2、添加左括號
        if(left < n)
        {
            path.push_back('(');
            left++;
            dfs();
            path.pop_back(); // 恢復(fù)現(xiàn)場
            left--;
        }
        if(right < left) // 3、添加右括號
        {
            path.push_back(')');
            right++;
            dfs();
            path.pop_back(); // 恢復(fù)現(xiàn)場
            right--;
        }
    }
};

3、解析

【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

二、組合

1、題目描述

leetcode鏈接

【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

2、代碼

class Solution 
{
public:
    // 1、全局變量
    int n = 0; // 1-n
    int k = 0; // 幾個(gè)數(shù)
    vector<int> path; // 路徑
    vector<vector<int>> ret; // 增加的路徑函數(shù)
    vector<vector<int>> combine(int _n, int _k) 
    {
        n = _n;
        k = _k;
        dfs(1); // 2、dfs
        return ret;
    }
    void dfs(int _pos)
    {
        // 1、函數(shù)遞歸出口
        if(path.size() == k)
        {
            ret.push_back(path);
            return;
        }
        // 2、遍歷--剪枝
        for(int pos = _pos; pos <= n; pos++)
        {
            path.push_back(pos);
            dfs(pos + 1); // pos下一個(gè)數(shù)進(jìn)行遞歸實(shí)現(xiàn)剪枝
            path.pop_back(); // 回溯--恢復(fù)現(xiàn)場         
        }
    }
};

3、解析

【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

三、目標(biāo)和

1、題目描述

leetcode鏈接
【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

2、代碼

全局變量的超時(shí)代碼:
原因在于nums的長度最長有20,其2^20次方太大了。但是leetcode居然通過了。

class Solution 
{
public:
    // 1、全局變量
    int ret; // 返回
    int aim; // 目標(biāo)值
    int path; // 路徑
    int findTargetSumWays(vector<int>& nums, int target) 
    {
        aim = target;
        dfs(nums, 0);
        return ret;
    }
    void dfs(vector<int>& nums, int pos)
    {
        // 1、遞歸出口
        if(pos == nums.size())
        {
            if(path == aim)
            {
                ret++;
            }
            return;
        }
        // 2、加法
        path += nums[pos];
        dfs(nums, pos + 1);
        path -= nums[pos]; // 恢復(fù)現(xiàn)場
        // 3、減法
        path -= nums[pos];
        dfs(nums, pos + 1);
        path += nums[pos]; // 恢復(fù)現(xiàn)場
    }
};

path作為參數(shù)的正確代碼:

class Solution 
{
public:
    // 1、全局變量
    int ret; // 返回
    int aim; // 目標(biāo)值
    int findTargetSumWays(vector<int>& nums, int target) 
    {
        aim = target;
        dfs(nums, 0, 0);
        return ret;
    }
    void dfs(vector<int>& nums, int pos, int path)
    {
        // 1、遞歸出口
        if(pos == nums.size())
        {
            if(path == aim)
            {
                ret++;
            }
            return;
        }
        // 2、加法
        path += nums[pos];
        dfs(nums, pos + 1, path);
        path -= nums[pos]; // 恢復(fù)現(xiàn)場
        // 3、減法
        path -= nums[pos];
        dfs(nums, pos + 1, path);
        path += nums[pos]; // 恢復(fù)現(xiàn)場
    }
};

3、解析

【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

四、組合總和

1、題目描述

leetcode鏈接
【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

2、代碼

解法一:

class Solution 
{
public:
    // 1、全局變量
    vector<vector<int>> ret; // 返回
    vector<int> path; // 路徑
    int aim; // 記錄target
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) 
    {
        aim = target;
        dfs(candidates, 0, 0);
        return ret;
    }
    void dfs(vector<int>& nums, int pos, int sum)
    {
        // 1、遞歸出口
        if(sum == aim)
        {
            ret.push_back(path);
            return;
        }
        if(sum > aim)
        {
            return;
        }
        // 循環(huán)
        for(int i = pos; i < nums.size(); i++)
        {
            path.push_back(nums[i]);
            sum += nums[i];
            dfs(nums, i, sum); // 還是從開始
            path.pop_back(); // 恢復(fù)現(xiàn)場
            sum -= nums[i];
        }
    }
};

解法二:

class Solution 
{
public:
    // 1、全局變量
    vector<vector<int>> ret; // 返回
    vector<int> path; // 路徑
    int aim; // 記錄target
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) 
    {
        aim = target;
        dfs(candidates, 0, 0);
        return ret;
    }
    void dfs(vector<int>& nums, int pos, int sum)
    {
        // 1、遞歸出口
        if(sum == aim)
        {
            ret.push_back(path);
            return;
        }
        if(sum > aim || pos == nums.size())
        {
            return;
        }
        // 循環(huán)
        for(int k = 0; k * nums[pos] + sum <= aim; k++)
        {
            if(k)
            {
                path.push_back(nums[pos]);
            }
            dfs(nums, pos + 1, sum + k * nums[pos]);
        }
        // 恢復(fù)現(xiàn)場
        for(int k = 1; k * nums[pos] + sum <= aim; k++)
        {
            path.pop_back();
        }
    }
};

3、解析

解法一:
【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先
解法二:
【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

五、字母大小寫全排列

1、題目描述

leetcode鏈接
【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

2、代碼

class Solution 
{
public:
    // 全局變量
    string path; // 路徑
    vector<string> ret; // 返回
    vector<string> letterCasePermutation(string s) 
    {
        dfs(s, 0); // 將s這個(gè)字符串的第0個(gè)位置進(jìn)行傳參
        return ret;
    }
    void dfs(string s, int pos)
    {
        // 遞歸出口
        if(pos == s.length())
        {
            ret.push_back(path);
            return;
        }
        // 先記錄一下當(dāng)前的字母
        char ch = s[pos];
        // 不改變
        path.push_back(ch);
        dfs(s, pos + 1);
        path.pop_back(); // 恢復(fù)現(xiàn)場
        // 改變
        if(ch < '0' || ch > '9')
        {
            // 進(jìn)行改變大小寫函數(shù)
            ch = Change(ch);
            path.push_back(ch);
            dfs(s, pos + 1); // 往下一層遞歸
            path.pop_back(); // 恢復(fù)現(xiàn)場
        }
    }
    char Change(char ch)
    {
        if(ch >= 'a' && ch <= 'z')
        {
            ch -= 32;
        }
        else
        {
            ch += 32;
        }
        return ch;
    }
};

3、解析

【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

六、優(yōu)美的排列

1、題目描述

leetcode鏈接
【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

2、代碼

class Solution 
{
public:
    // 全局變量
    int ret; // 返回
    bool check[16]; // 判斷相對應(yīng)位置是true還是false
    int countArrangement(int n) 
    {
        dfs(1, n); // 下標(biāo)從1開始
        return ret;
    }
    void dfs(int pos, int n)
    {
        // 遞歸出口
        if(pos == n + 1) // 因?yàn)槭菑?開始的
        {
            ret++; // 只用做數(shù)的統(tǒng)計(jì)即可
            return;
        }
        // 循環(huán)
        for(int i = 1; i <= n; i++)
        {
            if(check[i] == false && (pos % i == 0 || i % pos == 0))
            {
                check[i] = true; // 表示用了
                dfs(pos + 1, n); // 遞歸到下一層
                check[i] = false; // 恢復(fù)現(xiàn)場
            }
        }
    }
};

3、解析

【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

七、N皇后

1、題目描述

leetcode鏈接

【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

2、代碼

class Solution 
{
public:
    // 全局變量
    bool checkcol[10]; // 列
    bool checkG1[20]; // 主對角線
    bool checkG2[20]; // 副對角線
    vector<string> path; // 路徑
    vector<vector<string>> ret; // 返回
    int n; // 全局變量n
    vector<vector<string>> solveNQueens(int _n) 
    {
        n = _n;
        // 初始化棋盤
        path.resize(n);
        for(int i = 0; i < n; i++)
        {
            path[i].append(n, '.');
        }
        dfs(0);
        return ret;
    }
    void dfs(int row) // 行
    {
        // 遞歸出口
        if(row == n)
        {
            ret.push_back(path);
            return;
        }
        for(int col = 0; col < n; col++) // 每一行所在的列位置
        {
            if(checkcol[col] == false/*一整列*/ && checkG1[row - col + n] == false/*y-x+n*/ && checkG2[row + col] == false/*y+x*/) // 判斷條件進(jìn)入
            {
                path[row][col] = 'Q';
                checkcol[col] = checkG1[row - col + n] = checkG2[row + col] = true;
                dfs(row + 1);
                // 恢復(fù)現(xiàn)場
                path[row][col] = '.';
                checkcol[col] = checkG1[row - col + n] = checkG2[row + col] = false;
            }
        }
    }
};

3、解析

這里我們著重在剪枝方面上面的講解,我們重點(diǎn)需要明白N皇后剪枝的作用,因?yàn)榛屎笫悄艹詸M的一整行,豎的一整列,主對角線和副對角線一整個(gè),這里原本是要循環(huán)四次,但是我們經(jīng)過想法發(fā)現(xiàn)其實(shí)只需要判斷三個(gè)位置即可,第一個(gè)位置是豎著的,第二個(gè)位置是主對角線,第三個(gè)位置是副對角線,因?yàn)闄M著的一行是不需要進(jìn)行判斷的,因?yàn)槲覀兊乃悸肥且砸徽袨橐粋€(gè)視角,從左往右依次填的!我們根據(jù)簡單的數(shù)學(xué)原理,主對角線是y=x+b的,而由于會(huì)出現(xiàn)負(fù)數(shù)情況,我們左右兩邊各加一個(gè)n即可,我們此時(shí)b就為:y-x+n。我們副對角線是y=-x+b,我們的b為y+x即可!那我們接下來的思路畫出決策樹以后只需要考慮回溯的問題,我們恢復(fù)現(xiàn)場只需要將用過的全部變成沒用過的即可。
【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

八、有效的數(shù)獨(dú)

1、題目描述

leetcode鏈接
【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先

2、代碼

class Solution 
{
public:
    // 全局變量
    bool row[9][10]; // 行坐標(biāo)加值
    bool col[9][10]; // 列坐標(biāo)加值
    bool grid[3][3][10]; // 棋盤坐標(biāo)加值
    bool isValidSudoku(vector<vector<char>>& board) 
    {
        for(int i = 0; i < 9; i++) // 行
        {
            for(int j = 0; j < 9; j++) // 列
            {
                if(board[i][j] != '.') // 數(shù)字的時(shí)候
                {
                    int num = board[i][j] - '0'; // 記錄一下數(shù)
                    if(row[i][num] == true || col[j][num] == true || grid[i / 3][j / 3][num] == true)
                    {
                        return false;
                    }
                    row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = true;
                }
            }
        }
        return true;
    }
};

3、解析

【leetcode】深搜、暴搜、回溯、剪枝(C++)2,C++刷題,leetcode,剪枝,c++,算法,深度優(yōu)先文章來源地址http://www.zghlxwxcb.cn/news/detail-830305.html

到了這里,關(guān)于【leetcode】深搜、暴搜、回溯、剪枝(C++)2的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 窮舉&&深搜&&暴搜&&回溯&&剪枝(4)

    窮舉&&深搜&&暴搜&&回溯&&剪枝(4)

    一)單詞搜索: 直接在矩陣中依次找到特定字符串 79. 單詞搜索 - 力扣(LeetCode) 畫出決策樹,只需要做一個(gè)深度優(yōu)先遍歷: 1)設(shè)計(jì)dfs函數(shù):只需要關(guān)心每一層在做什么即可,從這個(gè)節(jié)點(diǎn)開始,開始去嘗試匹配字符串的下一個(gè)字符,就是從某一個(gè)位置的字符開始,上下左右下標(biāo)看看

    2024年02月09日
    瀏覽(16)
  • LeetCode刷題13:回溯+剪枝解決216.組合總和 III

    LeetCode刷題13:回溯+剪枝解決216.組合總和 III

    找出所有相加之和為? n ? 的? k ? 個(gè)數(shù)的組合,且滿足下列條件: 只使用數(shù)字1到9 每個(gè)數(shù)字? 最多使用一次 ? 返回? 所有可能的有效組合的列表 ?。該列表不能包含相同的組合兩次,組合可以以任何順序返回。 示例 1: 輸入: k = 3, n = 7 輸出: [[1,2,4]] 解釋: 1 + 2 + 4 = 7 沒有其他

    2024年02月02日
    瀏覽(18)
  • DFS:深搜+回溯+剪枝解決組合問題

    DFS:深搜+回溯+剪枝解決組合問題

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?創(chuàng)作不易,感謝支持!!! . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) 該題和前面是類似的,但是用回溯算法,會(huì)超

    2024年04月12日
    瀏覽(22)
  • DFS:深搜+回溯+剪枝解決排列、子集問題

    DFS:深搜+回溯+剪枝解決排列、子集問題

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 創(chuàng)作不易,感謝三連支持??!? . - 力扣(LeetCode) . - 力扣(LeetCode) ?方案1:不合法就continue 方案2:合法才能進(jìn)循環(huán) . - 力扣(LeetCode) . - 力扣(LeetCode) ?策略1:決策樹以選不選作為參考,結(jié)果為葉子節(jié)點(diǎn) 策略2:決策樹以選幾個(gè)

    2024年04月16日
    瀏覽(22)
  • DFS:深搜+回溯+剪枝解決矩陣搜索問題

    DFS:深搜+回溯+剪枝解決矩陣搜索問題

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?創(chuàng)作不易,感謝三連??!? . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) . - 力扣(LeetCode) 1、矩陣搜索問題經(jīng)常要用到向量,也就是我們可以通過dx和dy來幫助我們定義方向

    2024年04月17日
    瀏覽(20)
  • 【算法】遞歸、回溯、剪枝、dfs 算法題練習(xí)(組合、排列、總和問題;C++)

    【算法】遞歸、回溯、剪枝、dfs 算法題練習(xí)(組合、排列、總和問題;C++)

    后面的練習(xí)是接著下面鏈接中的文章所繼續(xù)的,在對后面的題練習(xí)之前,可以先將下面的的文章進(jìn)行了解??: 【算法】{畫決策樹 + dfs + 遞歸 + 回溯 + 剪枝} 解決排列、子集問題(C++) 思路 題意分析 :要求根據(jù)給出的數(shù)字,算出合法的括號組成個(gè)數(shù)。根據(jù)題目,我們可以總

    2024年02月22日
    瀏覽(24)
  • 【leetcode刷題之路】劍指Offer(3)——搜索與回溯算法

    7 搜索與回溯算法 7.1 【BFS】劍指 Offer 32 - I - 從上到下打印二叉樹 https://leetcode.cn/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/ ??這里借助隊(duì)列來實(shí)現(xiàn)廣度優(yōu)先遍歷,由于需要訪問每一層的節(jié)點(diǎn),而且這一層訪問才可以訪問下一層,所以可以考慮隊(duì)列的先進(jìn)先出,先把每一層的節(jié)

    2024年02月13日
    瀏覽(47)
  • 遞歸、搜索與回溯算法(專題二:深搜)

    遞歸、搜索與回溯算法(專題二:深搜)

    往期文章(希望小伙伴們在看這篇文章之前,看一下往期文章) (1)遞歸、搜索與回溯算法(專題零:解釋回溯算法中涉及到的名詞)【回溯算法入門必看】-CSDN博客 (2)遞歸、搜索與回溯算法(專題一:遞歸)-CSDN博客 ?深搜是實(shí)現(xiàn)遞歸的一種方式,接下來我們之間從題

    2024年01月20日
    瀏覽(17)
  • LeetCode 39. 組合總和(回溯+剪枝)

    鏈接:LeetCode 39. 組合總和 難度:中等 給你一個(gè) 無重復(fù)元素 的整數(shù)數(shù)組 candidates 和一個(gè)目標(biāo)整數(shù) target ,找出 candidates 中可以使數(shù)字和為目標(biāo)數(shù) target 的 所有 不同組合 ,并以列表形式返回。你可以按 任意順序 返回這些組合。 candidates 中的 同一個(gè) 數(shù)字可以 無限制重復(fù)被選

    2024年02月14日
    瀏覽(22)
  • 遞歸專題訓(xùn)練詳解(回溯,剪枝,深度優(yōu)先)

    遞歸專題訓(xùn)練詳解(回溯,剪枝,深度優(yōu)先)

    在經(jīng)典漢諾塔問題中,有 3 根柱子及 N 個(gè)不同大小的穿孔圓盤,盤子可以滑入任意一根柱子。一開始,所有盤子自上而下按升序依次套在第一根柱子上(即每一個(gè)盤子只能放在更大的盤子上面)。移動(dòng)圓盤時(shí)受到以下限制: (1) 每次只能移動(dòng)一個(gè)盤子; (2) 盤子只能從柱子頂端滑出

    2024年02月07日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包