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

算法刷題Day 29 遞增子序列+全排列+全排列II

這篇具有很好參考價值的文章主要介紹了算法刷題Day 29 遞增子序列+全排列+全排列II。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Day 29 回溯算法

491. 遞增子序列

如果直接像下面這樣寫的話,會出錯,出錯的案例類似:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9nrEEc2S-1688623883770)(LC491-遞增子序列+LC.assets/image-20230703201315163.png)]

class Solution {
    vector<vector<int>> rst;
    vector<int> path;

    void backtracking(const vector<int> &nums, int idx)
    {
        if (path.size() > 1)
        {
            rst.push_back(path);
        }

        for (int i = idx; i < nums.size(); i++)
        {
            if (i > idx && nums[i] == nums[i - 1]) // 不能使用這一去重邏輯
            {
                continue;
            }

            if (path.empty() || path.back() <= nums[i])
            {
                path.push_back(nums[i]);
                backtracking(nums, i + 1);
                path.pop_back();
            }
        }
    }

public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        rst.clear();
        path.clear();
        backtracking(nums, 0);
        return rst;
    }
};

本題求自增子序列,是不能對原數(shù)組進行排序的,排完序的數(shù)組都是自增子序列了。

所以不能使用之前的去重邏輯!

同一父節(jié)點下的同層上使用過的元素就不能再使用了

正確的寫法如下:

class Solution {
    vector<vector<int>> rst;
    vector<int> path;

    void backtracking(const vector<int> &nums, int idx)
    {
        if (path.size() > 1)
        {
            rst.push_back(path);
        }

        int used[201] = {0};

        for (int i = idx; i < nums.size(); i++)
        {
            if ((!path.empty() && path.back() > nums[i]) || used[nums[i] + 100])
            {
                continue;
            }
            used[nums[i] + 100] = 1;
            path.push_back(nums[i]);
            backtracking(nums, i + 1);
            path.pop_back();
        }
    }

public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        rst.clear();
        path.clear();
        backtracking(nums, 0);
        return rst;
    }
};

46. 全排列

需要有一個used數(shù)組來記錄已經(jīng)被使用過的元素索引

class Solution {
    vector<vector<int>> rst;
    vector<int> path;

    void backtracking(const vector<int> &nums, vector<bool> &used) 
    {
        if (path.size() == nums.size())
        {
            rst.push_back(path);
            return;
        }

        for (int i = 0; i < nums.size(); ++i)
        {
            if (used[i]) continue;
            used[i] = true;
            path.push_back(nums[i]);
            backtracking(nums, used);
            path.pop_back();
            used[i] = false;
        }
    }

public:
    vector<vector<int>> permute(vector<int>& nums) {
        rst.clear();
        path.clear();
        vector<bool> used(nums.size(), false);
        backtracking(nums, used);
        return rst;
    }
};

47. 全排列II

還要強調(diào)的是去重一定要對元素進行排序,這樣我們才方便通過相鄰的節(jié)點來判斷是否重復使用了文章來源地址http://www.zghlxwxcb.cn/news/detail-612872.html

class Solution {
    vector<vector<int>> rst;
    vector<int> path;

    void backtracking(const vector<int> &nums, vector<bool> &used)
    {
        if (path.size() == nums.size())
        {
            rst.push_back(path);
            return;
        }

        for (int i = 0; i < nums.size(); ++i)
        {
            if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1])
            {
                continue;
            }

            if (!used[i])
            {
                used[i] = true;
                path.push_back(nums[i]);
                backtracking(nums, used);
                path.pop_back();
                used[i] = false;
            }
        }
    }

public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        rst.clear();
        path.clear();
        sort(nums.begin(), nums.end());
        vector<bool> used(nums.size(), false);
        backtracking(nums, used);
        return rst;
    }
};

到了這里,關于算法刷題Day 29 遞增子序列+全排列+全排列II的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • [100天算法】-全排列 II(day 51)

    時間復雜度: 空間復雜度: JavaScript Code

    2024年02月06日
    瀏覽(12)
  • java數(shù)據(jù)結(jié)構(gòu)與算法刷題-----LeetCode667. 優(yōu)美的排列 II

    java數(shù)據(jù)結(jié)構(gòu)與算法刷題-----LeetCode667. 優(yōu)美的排列 II

    java數(shù)據(jù)結(jié)構(gòu)與算法刷題目錄(劍指Offer、LeetCode、ACM)-----主目錄-----持續(xù)更新(進不去說明我沒寫完): https://blog.csdn.net/grd_java/article/details/123063846 解題思路 題目要求我們返回一個數(shù)組長度為n的數(shù)組,必須含有1~n的所有數(shù),并且從左到右,相鄰的元素依次相減,它們的差,必

    2024年01月25日
    瀏覽(25)
  • 算法刷題Day 37 單調(diào)遞增的數(shù)字+監(jiān)聽二叉樹

    兩個可能經(jīng)常要用到的函數(shù) 字符串轉(zhuǎn)數(shù)字: to_string() 數(shù)字轉(zhuǎn)字符串: stoi() 利用樹后續(xù)遍歷,同時加上狀態(tài)轉(zhuǎn)移的方法,非常值得反復學習

    2024年02月13日
    瀏覽(23)
  • [100天算法】-最長遞增子序列的個數(shù)(day 47)

    思路 代碼 JavaScript Code C++ Code 復雜度分析 時間復雜度:$O(N^2)$。N 是數(shù)組? nums ?的長度。 空間復雜度:$O(N)$。N 是輔助數(shù)組? length ?和? count ?的長度。

    2024年02月07日
    瀏覽(25)
  • 算法刷題Day 39 不同路徑+不同路徑II

    遞歸(深搜) 使用遞歸的方法超時(可以過37個case) 來分析一下時間復雜度,這個深搜的算法,其實就是要遍歷整個二叉樹。 這棵樹的深度其實就是m+n-1(深度按從1開始計算)。 那二叉樹的節(jié)點個數(shù)就是 2^(m + n - 1) - 1。可以理解深搜的算法就是遍歷了整個滿二叉樹(其實沒

    2024年02月12日
    瀏覽(19)
  • 算法刷題Day 28 復原IP地址+子集+子集II

    我的做法有點奇怪,還是參考一下代碼隨想錄的做法吧 涉及到去重,可別忘了排序 不然去重的效果沒法實現(xiàn)

    2024年02月16日
    瀏覽(19)
  • 算法刷題Day 59 下一個更大元素II+接雨水

    其實也可以不擴充nums,而是在遍歷的過程中模擬走了兩邊nums 三種方法都寫了一遍 暴力方法 逐列計算 找到當前位置,左邊最高的柱子的索引和右邊最高的柱子的索引,兩者中相對小的那個,將去當前位置的高度,就是水柱的高度,而寬度是1 超時了 雙指針 提前記錄好左邊最

    2024年02月14日
    瀏覽(18)
  • 算法刷題Day 27 組合總和+組合總和II+分割回文子串

    本題的特點是元素為可重復選取的 其實只要在原來的基礎上添加一點小小的變化就是實現(xiàn)重復選?。ㄅc排列區(qū)別開),一時沒想出來 這里與39.組合總和 (opens new window)最大的不同就是要去重了。 前面我們提到:要去重的是“同一樹層上的使用過”,如何判斷同一樹層上元素(

    2024年02月14日
    瀏覽(20)
  • 力扣算法刷題Day39|動態(tài)規(guī)劃:不同路徑 I&II

    力扣題目:#62.不同路徑 刷題時長:參考題解后10min 解題方法:動規(guī) 復雜度分析 時間O(m*n) 空間O(m*n) 問題總結(jié) 初始化二維數(shù)組的python語法:i 對應 m,j 對應n 二維遍歷順序,從上到下從左到右通過兩層for循環(huán)實現(xiàn),其中startindex應為1 本題收獲 動規(guī)思路 確定dp數(shù)組及下標的含義

    2024年02月12日
    瀏覽(19)
  • 算法刷題Day 31 分發(fā)餅干+擺動序列+最大子序列和

    分發(fā)餅干其實有很多種寫法,但是下面這種貪心的解法是最好理解,也最好解釋的 我的其他解法 貪心算法 這道題用貪心算法要考慮的細節(jié)有很多。 動態(tài)規(guī)劃 有點難(甚至涉及到了線段樹),等后面二刷的時候再來學好了 暴力解法 超時了 貪心算法 貪心算法的代碼寫起來簡

    2024年02月15日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包