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

代碼隨想錄 - Day34 - 回溯:遞增子序列+排列問題

這篇具有很好參考價(jià)值的文章主要介紹了代碼隨想錄 - Day34 - 回溯:遞增子序列+排列問題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

代碼隨想錄 - Day34 - 回溯:遞增子序列+排列問題

491. 遞增子序列

如果有相等的整數(shù)也算遞增序列
遞增子序列中至少有兩個(gè)元素 (遍歷的時(shí)候不用遍歷nums中最后一個(gè)元素)

輸入:nums = [4,6,6,2,8]
輸出:[[4,6],[4,6,6],[4,6,6,8],[4,6,8],[4,8],[6,6],[6,6,8],[6,8],[2,2],[2,2,8],[2,8]]
class Solution:
    def backtracking(self, nums, startIndex, path, result):
        if len(path) > 1:
            result.append(path[:])
            # 注意這里不要加return,因?yàn)橐渖系墓?jié)點(diǎn)

        uset = set()    # 用set()對(duì)本層元素去重
        for i in range(startIndex, len(nums)):
            # 排除重復(fù)的情況,跳過遞減的情況
            if (path and nums[i] < path[-1]) or (nums[i] in uset):
                continue
            uset.add(nums[i])       # 記錄這個(gè)元素在本層用過了,本層后面不能再用了
            path.append(nums[i])
            self.backtracking(nums, i + 1, path, result)    # 遞歸
            path.pop()  # 回溯

    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        result = []
        self.backtracking(nums, 0, [], result)
        return result

題目說了數(shù)值范圍,所以還可以用哈希表去重,速度比set()快很多。
但是,個(gè)人覺得沒必要,因?yàn)榉旁趯?shí)際情況中一般不會(huì)給數(shù)值范圍。

class Solution:
    def backtracking(self, nums, startIndex, path, result):
        if len(path) > 1:
            result.append(path[:])
            # 注意這里不要加return,因?yàn)橐渖系墓?jié)點(diǎn)

        used = [0] * 201  # 使用數(shù)組來進(jìn)行去重操作,題目說數(shù)值范圍[-100, 100]
        for i in range(startIndex, len(nums)):
            # 排除重復(fù)的情況,跳過遞減的情況
            # 這里是利用數(shù)組的下標(biāo)和數(shù)組中存儲(chǔ)的元素來進(jìn)行去重
            if (path and nums[i] < path[-1]) or used[nums[i] + 100] == 1:
                continue
            used[nums[i] + 100] = 1  # 標(biāo)記當(dāng)前元素已經(jīng)使用過
            path.append(nums[i])
            self.backtracking(nums, i + 1, path, result)    # 遞歸
            path.pop()  # 回溯

    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        result = []
        self.backtracking(nums, 0, [], result)
        return result

46.全排列

全排列,即[1,2][2,1]算作兩種排列,所以這道題的result要收集所有的葉子節(jié)點(diǎn)
nums 中的所有整數(shù)互不相同,因此無需考慮去重

輸入:nums = [1,2,3]
輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

這種題就要考慮新的問題了,即它每次的startIndex都是固定的,遇到取過的數(shù)時(shí)則需要跳過

class Solution:
    def backtracking(self, nums, used, path, result):
        if len(path) == len(nums):
            result.append(path[:])
            return

        for i in range(len(nums)):
            if used[i]:     # 遇到取過的數(shù)時(shí)則需要跳過
                continue
            used[i] = True  # 取過的數(shù)設(shè)為True
            path.append(nums[i])
            self.backtracking(nums, used, path, result)
            path.pop()      # 回溯
            used[i] = False # 回溯后把該數(shù)設(shè)回False

    def permute(self, nums: List[int]) -> List[List[int]]:
        result = []
        used = [False] * len(nums)
        self.backtracking(nums, used, [], result)
        return result

考慮跳過用過的數(shù)時(shí),腦子里第一反應(yīng)是dict,卻忘記了用更為簡單的數(shù)組也可以…

47. 全排列 II

相較于上一題,需要考慮去重的問題,dict貌似有用武之地了

輸入:nums = [1,2,1]
輸出:[[1,1,2], [1,2,1], [2,1,1]]
class Solution:
    def backtracking(self, nums, used, path, result):
        if len(path) == len(nums):
            result.append(path[:])
            return

        for i in range(len(nums)):
            # 要去重的是 用過且重復(fù) 的數(shù)
            if i > 0 and nums[i] == nums[i - 1] and used[i - 1] == False:
                continue
            if used[i] == False:     # 遇到取過的數(shù)時(shí)則需要跳過
                used[i] = True  # 取過的數(shù)設(shè)為True
                path.append(nums[i])
                self.backtracking(nums, used, path, result)
                path.pop()      # 回溯
                used[i] = False # 回溯后把該數(shù)設(shè)回False

    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        result = []
        used = [False] * len(nums)
        nums.sort()             # 提前排好序,方便后續(xù)去重
        self.backtracking(nums, used, [], result)
        return result

感覺今天這幾道題思路好想,代碼不好寫,總會(huì)在一些細(xì)節(jié)上出錯(cuò),需要多練習(xí)。

以及,mermaid畫圖好麻煩。。文章來源地址http://www.zghlxwxcb.cn/news/detail-699014.html

到了這里,關(guān)于代碼隨想錄 - Day34 - 回溯:遞增子序列+排列問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?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)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

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

相關(guān)文章

  • 代碼隨想錄 Day - 59|#647 回文字串|#516 最長回文子序列

    ● 647. 回文字串 ● 516. 最長回文子序列 給你一個(gè)字符串 s ,請(qǐng)你統(tǒng)計(jì)并返回這個(gè)字符串中回文子串的數(shù)目。 回文字符串是正著讀和倒過來讀一樣的字符串。 子字符串是字符串中的由連續(xù)字符組成的一個(gè)序列。 具有不同開始位置或結(jié)束位置的子串,即使是由相同的字符組成

    2024年02月07日
    瀏覽(40)
  • 【代碼隨想錄day19】從前序與中序遍歷序列構(gòu)造二叉樹

    【代碼隨想錄day19】從前序與中序遍歷序列構(gòu)造二叉樹

    使用遞歸建樹,流程如下: 取出后序節(jié)點(diǎn)創(chuàng)建新樹的節(jié)點(diǎn) 找到新樹的節(jié)點(diǎn)在中序中的索引 分割中序序列 分割后序序列 繼續(xù)遞歸建立整顆新樹

    2024年02月15日
    瀏覽(24)
  • 【隨想錄】Day34—第八章 貪心算法 part03

    【隨想錄】Day34—第八章 貪心算法 part03

    題目鏈接:1005. K 次取反后最大化的數(shù)組和 貪心思路 : 先對(duì)數(shù)組中的元素進(jìn)行排序 遍歷數(shù)組,如果 當(dāng)前遍歷的位置值 0 k0 直接變號(hào),之后對(duì) k 進(jìn)行 -- 如果不小于 0 ,此時(shí)需要先排序,判斷 k 是否為奇數(shù),如果是奇數(shù)直接對(duì)最小位進(jìn)行取反 最終遍歷數(shù)組求和 ? K 次取反后最

    2024年04月27日
    瀏覽(95)
  • 代碼隨想錄——回溯

    代碼隨想錄——回溯

    代碼隨想錄——回溯 回溯的本質(zhì)就是遞歸遍歷,但在完成某一條路之后會(huì)撤回到上一層,然后重新選擇另一條路繼續(xù)遍歷,是一個(gè)比較低效的算法,能進(jìn)行提升的方式就是剪枝。 組合 鏈接:https://leetcode.cn/problems/combinations/description/ vectorvector int 作為最終返回的結(jié)果,vector

    2024年01月19日
    瀏覽(594)
  • 代碼隨想錄打卡第34天

    2024年02月11日
    瀏覽(21)
  • 代碼隨想錄二刷 |回溯 |分割回文串

    131.分割回文串 給定一個(gè)字符串 s,將 s 分割成一些子串,使每個(gè)子串都是回文串。 返回 s 所有可能的分割方案。 示例: 輸入: “aab” 輸出: [ [“aa”,“b”], [“a”,“a”,“b”] ] 回溯三部曲 遞歸函數(shù)參數(shù) 全局變量數(shù)組path存放切割后回文的子串,二維數(shù)組result存放結(jié)果集 參數(shù)

    2024年01月24日
    瀏覽(303)
  • 代碼隨想錄-回溯算法(分割問題)|ACM模式

    目錄 前言: 131. 分割回文串 題目描述: 輸入輸出描述: 思路和想法: 93. 復(fù)原 IP 地址 題目描述: 輸入輸出描述: 思路和想法: ? ? ? ? ?回溯算法中的分割問題,是可以抽象為組合問題的,其中模擬切割線、切割問題中遞歸如何終止以及遞歸循環(huán)中如何截取子串,是我們

    2024年02月15日
    瀏覽(93)
  • 代碼隨想錄-回溯算法(子集問題)|ACM模式

    目錄 前言: 78. 子集 題目描述: 輸入輸出描述: 思路和想法: 90. 子集 II 題目描述: 輸入輸出描述: 思路和想法: 491. 遞增子序列 題目描述: 輸入輸出描述: 思路和想法: 如果把 子集問題、組合問題、分割問題都抽象為一棵樹的話, 那么組合問題和分割問題都是收集

    2024年02月15日
    瀏覽(984)
  • 代碼隨想錄刷題筆記 DAY 29 | 非遞減子序列 No.491 | 全排列 No.46 | 全排列 II No. 47

    代碼隨想錄刷題筆記 DAY 29 | 非遞減子序列 No.491 | 全排列 No.46 | 全排列 II No. 47

    01. 非遞減子序列(No. 491) 題目鏈接 代碼隨想錄題解 1.1 題目 給你一個(gè)整數(shù)數(shù)組 nums ,找出并返回所有該數(shù)組中不同的遞增子序列,遞增子序列中 至少有兩個(gè)元素 。你可以按 任意順序 返回答案。 數(shù)組中可能含有重復(fù)元素,如出現(xiàn)兩個(gè)整數(shù)相等,也可以視作遞增序列的一種

    2024年02月21日
    瀏覽(21)
  • 代碼隨想錄閱讀筆記-回溯【電話號(hào)碼的字母組合】

    代碼隨想錄閱讀筆記-回溯【電話號(hào)碼的字母組合】

    題目 給定一個(gè)僅包含數(shù)字 2-9 的字符串,返回所有它能表示的字母組合。 給出數(shù)字到字母的映射如下(與電話按鍵相同)。注意 1 不對(duì)應(yīng)任何字母。 示例: 輸入:\\\"23\\\" 輸出:[\\\"ad\\\", \\\"ae\\\", \\\"af\\\", \\\"bd\\\", \\\"be\\\", \\\"bf\\\", \\\"cd\\\", \\\"ce\\\", \\\"cf\\\"]. 說明:盡管上面的答案是按字典序排列的,但是你可以任意

    2024年04月13日
    瀏覽(91)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包