【藍橋杯速成】| 11.回溯 之 子集問題

題目一:子集

問題描述

78. 子集 - 力扣(LeetCode)

給你一個整數數組?nums?,數組中的元素?互不相同?。返回該數組所有可能的子集(冪集)。

解集?不能?包含重復的子集。你可以按?任意順序?返回解集。

示例 1:

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

示例 2:

輸入:nums = [0]
輸出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums?中的所有元素?互不相同

解題步驟

根據前面的做題經驗,這一題應該比較容易AC

有沒有覺得數組所有可能的子集很像我們每一層遍歷的結果,

所以關于子集問題,我們需要的結果不是葉子結點,而是所有結點

那么其它代碼邏輯不變,我們只需要改一下收集結果的位置即可

把result.push_back(path);這行代碼從終止條件中拿出來

就表示我們每一步都會執行這一句,

空集是所有集合的子集,那么剛調用這個backtracking函數我們就會先加入[]

后面就是遍歷一下就加入一下,輸出順序是縱深的,因為這里用的遞歸調用

對于終止條件,即用完數組所有元素,

那么我們用于指向遍歷元素的startindex必然大于等于nums.size()

但其實也可以不加終止條件,因為我們的for循環會讓i<nums.size(),它已經結束了

完整代碼如下!

code

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,int startindex){//返回的是每個結點result.push_back(path);if(startindex>=nums.size()){return;}for(int i=startindex;i<nums.size();i++){path.push_back(nums[i]);backtracking(nums,i+1);path.pop_back();}}vector<vector<int>> subsets(vector<int>& nums) {backtracking(nums,0);return result;}
};

題目二:子集②

問題描述

90. 子集 II - 力扣(LeetCode)

給你一個整數數組?nums?,其中可能包含重復元素,請你返回該數組所有可能的?子集(冪集)。

解集?不能?包含重復的子集。返回的解集中,子集可以按?任意順序?排列。

示例 1:

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

示例 2:

輸入:nums = [0]
輸出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10

解題步驟

這題與上一題的區別就在于nums數組中可能包含重復元素

那么這個關鍵點和我們之前做過的組合總和②是一樣的處理

重點就在于去重

我們需要排掉所有在同一層上相同的結果

但同時保證縱向不會被誤判,因為縱向取數產生的數字重復,并不意味著答案重復

縱向是不斷把子集變長的過程,加進來的都是從數組中取出的,

取出動作并不存在重復,哪怕數字一樣但它不是從nums的同一位置取出的!

所以這一題我們要在單層遍歷中加入去重代碼即可

if(i>0 && nums[i]==nums[i-1] && used[i-1]==False)

為了方便判斷重復元素,我們在主函數中會先對nums數組進行排序

那么遍歷到第i個元素就可以通過?nums[i]==nums[i-1]這個代碼判斷是否出現重復元素

為了保證nums[i-1]合法,所以i必須大于0,

因為每次操作我們會用used數組標記數字的使用情況,

在縱向的遞歸中,used[i]=used[i-1]=true

但在同層當中,由于前一步存在回溯,我們的used[i-1]==false

翻譯一下就是,上一層用過后放回去假裝沒用過

符合以上條件就是我們的重復元素,那么直接continue不需要繼續執行

完整代碼如下,需要注意在主函數中定義used數組和對nums數組進行排序!

code

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,int startindex,vector<bool>& used){//返回的是每個結點result.push_back(path);for(int i=startindex;i<nums.size();i++){if(i>0 && nums[i]==nums[i-1] && used[i-1]==false){//去重continue;}path.push_back(nums[i]);used[i]=true;backtracking(nums,i+1,used);used[i]=false;path.pop_back();}}vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<bool> used(nums.size(), false);sort(nums.begin(),nums.end());backtracking(nums,0,used);return result;}
};

題目三:非遞減子序列

問題描述

491. 非遞減子序列 - 力扣(LeetCode)

給你一個整數數組?nums?,找出并返回所有該數組中不同的遞增子序列,遞增子序列中?至少有兩個元素?。你可以按?任意順序?返回答案。

數組中可能含有重復元素,如出現兩個整數相等,也可以視作遞增序列的一種特殊情況。

示例 1:

輸入:nums = [4,6,7,7]
輸出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

示例 2:

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

提示:

  • 1 <= nums.length <= 15
  • -100 <= nums[i] <= 100

解題步驟

這一題可以看成上一題的升級版,它在要求不重復的情況下同時要求該子序列遞增

但需要注意的是這里的子序列是按照原數組排序生成的,

我們不能使用sort函數,不然結果也是不正確的

所以我們要換一種去重邏輯

但仍舊需要做到只除去同一層的重復項

不除去縱向的重復元素

那么排序不能用,used數組也就不能用了,

我們需要一個新的輔助,對于去重首選unordered_set,

可以利用find函數很快檢查到是否已經出現過

那么我們在處理這一層元素前就需要先定義好這個uset

unordered_ser<int> uset;

再進入到遍歷邏輯中,挨個檢查元素是否符合題意

如果該元素之前已經用過,那么它必然可以在uset中找到

所以第一個不符合的情況是

if(uset.find(nums[i])!=uset.end())

要確保子序列遞增,那么nums[i]不能小于當前path的最后一個元素,即path.back()

為防止出現path為空時的錯誤,先判斷path.empty()為false

則第二個不符合情況如下

if(!path.empty() && nums[i]<path.back)

?可以合并這兩種情況,continue

沒有出現以上情況,則處理該結點

把nums[i]加入uset中做記錄

再加入該數到path中

遞歸調用后回溯

uset.insert(nums[i]);

path.push_back(nums[i]);

backtracking(nums,i+1);

path.pop_back();

這里的uset不需要回溯,因為我們在每一層使用它,

如果是遞歸會重新定義,內容被清空不影響判斷去重?

此外在加入結果到result數組中時,我們要先判斷path.size()>=2,

這也是題目條件之一,要求子序列長度大于等于2

if(path.size()>=2){

? ? ? ? result.push_back(path);

}

組合所有代碼,即可得到完整版如下方!?

code

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,int startindex){if(path.size()>=2){result.push_back(path);}unordered_set<int> uset; // 使用set來對本層元素進行去重for(int i=startindex;i<nums.size();i++){if(!path.empty() && nums[i]<path.back() || uset.find(nums[i])!=uset.end())            {continue;}uset.insert(nums[i]);path.push_back(nums[i]);backtracking(nums,i+1);path.pop_back();}}vector<vector<int>> findSubsequences(vector<int>& nums) {backtracking(nums,0);return result;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74508.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74508.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74508.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nginx目錄結構

Nginx目錄結構 ? Nginx 的安裝目錄結構可能會因安裝方式&#xff08;如使用包管理器、源碼編譯等&#xff09;和操作系統的不同而有所差異。以下是通過在線安裝時&#xff0c;Nginx 默認的目錄結構&#xff0c;以及各目錄和文件的作用。 yum install nginx查詢nginx [rootRo…

2.(vue3.x+vite)使用vue-router

前端技術社區總目錄(訂閱之前請先查看該博客) 效果預覽 路由配置的“/”與“helloWorld”都可以訪問到以下內容 http://10.11.0.87:4000/#/ http://10.11.0.87:4000/#/helloWorld 1:安裝vue-router npm i vue-router 2:創建router文件 在src的目錄下創建router文件夾…

后端返回了 xlsx 文件流,前端怎么下載處理

當后端返回一個 .xlsx 文件流時&#xff0c;前端可以通過 JavaScript 處理這個文件流并觸發瀏覽器下載。 實現步驟 發送請求獲取文件流&#xff1a; 使用 fetch 或 axios 等工具向后端發送請求&#xff0c;確保響應類型設置為 blob&#xff08;二進制數據流&#xff09;。 創建…

HTML5拖拽功能教程

HTML5拖拽功能教程 簡介 HTML5引入了原生拖放(Drag and Drop)API&#xff0c;使開發者能夠輕松實現網頁中的拖拽功能&#xff0c;無需依賴第三方庫。拖拽功能可以大大提升用戶體驗&#xff0c;適用于文件上傳、列表排序、看板系統等多種交互場景。本教程將帶您全面了解HTML拖…

VUE3 路由配置

1.下載 VueRouter 模塊 在命令行中輸入 yarn add vue-router 2.導?相關函數 在自己創建的router/index.js 文件中 import { createRouter, createWebHashHistory } from vue-router 3.創建路由實例 在自己創建的router/index.js 文件中 const theFirstRouter ()>{return…

歷史序列影像 Esri的World Imagery Wayback簡介

Esri的World Imagery Wayback是一個專注于提供歷史衛星影像的在線平臺&#xff0c;由全球領先的地理信息系統&#xff08;GIS&#xff09;技術提供商Esri開發。該平臺整合了多源衛星影像數據&#xff0c;允許用戶回溯特定區域在不同時間點的影像變化&#xff0c;支持時間序列分…

golang結構體與指針類型

結構體與指針類型 指針類型字段 具名字段 舉例 package struct_knowledgeimport "fmt"//結構體字段為指針類型 func StructWithPoint(){type Student struct{name *string}var lisa Studentfmt.Printf("賦值前,Student的實例的值%#v\n",lisa)//錯誤的賦…

NetMizer-日志管理系統-遠程命令執行漏洞挖掘

漏洞描述&#xff1a;NetMizer 日志管理系統 cmd.php中存在遠程命令執行漏洞&#xff0c;攻擊者通過傳入 cmd參數即可命令執行 1.fofa搜素語句 title"NetMizer 日志管理系統" 2.漏洞驗證 網站頁面 驗證POC /data/manage/cmd.php?cmdid

Contactile三軸觸覺傳感器:多維力感賦能機器人抓取

在非結構化環境中&#xff0c;機器人對物體的精準抓取與操作始終面臨巨大挑戰。傳統傳感器因無法全面感知觸覺參數&#xff08;如三維力、位移、摩擦&#xff09;&#xff0c;難以適應復雜多變的場景。Contactile推出的三軸觸覺力傳感器&#xff0c;通過仿生設計與創新光學技術…

OpenCV三維解算常用方法C++

如果標定過程是通過OpenCV張正友標定法實現的&#xff0c;得到的內參外參保存在.txt文件中是這樣的形式&#xff1a; ① 內參intrinsics.txt&#xff1a; ② 外參extrinsics.txt&#xff1a; 那么可以通過如下方法讀取.txt文件獲取左右相機內外參&#xff0c;主要包括三維解算…

棧和隊列相關知識題目

棧的底層原理 棧&#xff08;Stack&#xff09;是一種后進先出&#xff08;LIFO&#xff09;?的線性數據結構&#xff0c;所有操作&#xff08;如插入、刪除&#xff09;僅在棧頂進行。它的底層實現可以是數組或鏈表&#xff0c;具體取決于編程語言和應用場景。 1.基于數組實…

【實戰案例】永洪vividime:精準賦能零售行業,實現數據洞察與業務增長

在零售食品行業變革加速、市場競爭白熱化的背景下&#xff0c;XX集團作為休閑食品領域頭部企業&#xff0c;面臨消費趨勢變化、宏觀經濟承壓及業績增長乏力的多重挑戰。為破解增長困境&#xff0c;集團將“收入增長金額”確立為核心戰略指標&#xff08;北極星指標&#xff09;…

一些題目記錄

別人面經題目記錄 https://zhuanlan.zhihu.com/p/32626732052 實現 NMS&#xff0c;七八次&#xff0c;很高頻&#xff1b; 實現 MultiHeadSelfAttention&#xff0c;大概 三四次&#xff1b; 用 Numpy 或者 List 實現MLP 的前向和反向&#xff0c;4次&#xff1b; Leetcode …

面試題分享-多線程順序打印奇偶數

目錄 1.題目詳情 2.解題思路 2.1.分析題目 2.2.解析思路 3.代碼實現 4.運行結果 1.題目詳情 昨天刷抖音&#xff0c;遇到一個面試題&#xff0c;描述如下&#xff1a; 請使用兩個線程&#xff0c;分別順序交替打印奇數和偶數&#xff0c;直到10為止。例如有兩個線程&#…

模型 杜根定律

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思維模型目錄。信心>能力、行動導向、未來時態。 1 杜根定律的應用 1.1 公共政策博弈——底特律市長杜根的保險改革攻堅戰 核心挑戰&#xff1a;底特律市長Mike Duggan面臨汽車保險費率畸高導致居民陷入貧困循環的…

關于在vscode中的Linux 0.11 應用程序項目的生成和運行

首先我們需要需要查看鏡像文件 查看軟盤鏡像文件 floppyb.img 中的內容 在 VSCode 的“Terminal”菜單中選擇“Run Build Task...”&#xff0c;會在 VSCode 的頂部中間位置彈出一個 可以執行的 Task 列表&#xff0c;選擇其中的“打開 floppyb.img”后會使用 Floppy Editor …

使用CSS3實現炫酷的3D視差滾動效果

使用CSS3實現炫酷的3D視差滾動效果 這里寫目錄標題 使用CSS3實現炫酷的3D視差滾動效果項目概述核心技術實現1. 3D空間的創建2. 視差層級設置3. 動畫效果實現流星動畫月亮發光效果 技術難點與解決方案1. 層級重疊問題2. 性能優化3. 響應式適配 開發心得總結 項目概述 在這個項目…

作業12 (2023-05-15 指針概念)

第1題/共11題【單選題】 關于指針的概念,錯誤的是:( ) A.指針變量是用來存放地址的變量 B.指針變量中存的有效地址可以唯一指向內存中的一塊區域 C.野指針也可以正常使用 D.局部指針變量不初始化就是野指針 回答正確 答案解析: A:正確,指針變量中存儲的是一個地址,指…

【ESP32S3】esp32獲取串口數據并通過http上傳到前端

通過前面的學習&#xff08;前面沒發過&#xff0c;因為其實就是跑它的demo&#xff09;了解到串口配置以及開啟線程實現功能的工作流程&#xff0c;與此同時還有esp32作為STA節點&#xff0c;將數據通過http發送到服務器。 將這兩者聯合 其實是可以得到一個&#xff1a;esp32獲…

《鴻蒙攜手AI:解鎖智慧出行底層邏輯》

在科技飛速發展的當下&#xff0c;智慧出行成為人們對未來交通的美好期許&#xff0c;而鴻蒙系統與人工智能的深度融合&#xff0c;正為這一愿景的實現提供強大助力。從技術原理角度深入剖析&#xff0c;鴻蒙系統究竟如何支撐人工智能在智慧出行場景中的應用呢&#xff1f;這背…