代碼隨想錄刷題Day56

子集

這道題求子集,集合的基本運算之一,按照高中數學學習集合的知識,可以把這個找冪集的過程按照元素的個數來劃分步驟。也就是先找零個元素的子集,再找一個元素的子集,再找兩個元素的子集...一直到找N個元素的集合為止。

我的第一想法是對找k個元素的集合這個過程使用回溯的方法。

回溯三部曲:

  • 返回值void,參數startIndex
  • 終止條件:找到n個數就可結束
  • 當層函數邏輯循環
    • 橫向循環:從startIndex開始往后依次遍歷,作為當前輪的所有可能
    • 縱向迭代:startIndex層的數的下一個數作為迭代的下一層起點

代碼(執行用時擊敗35.31%,消耗內存擊敗17.38%):

class Solution {
vector<vector<int>> ans;
vector<int> path;
void backtrack(vector<int> nums,int len,int startIndex){if(path.size()==len){//終止條件ans.push_back(path);return;}for(int i = startIndex;i<nums.size();i++){//當前輪的循環path.push_back(nums[i]);backtrack(nums,len,i+1);//下一層的迭代path.pop_back();}
}
public:vector<vector<int>> subsets(vector<int>& nums) {for(int k = 0;k<=nums.size();k++){//子集元素的數量從0到|S|backtrack(nums,k,0);}return ans;}
};

感覺自己的時間和空間消耗還是比較糟糕,參考代碼隨想錄的做法,發現原來可以不用這樣劃分子集的長度。因為求冪集的遞歸-回溯過程是寬度為集合長度,高度為集合長度的一棵樹。如下圖:

代碼也省去對子集中元素個數的一一羅列,代碼執行時間擊敗33.87%,消耗內存擊敗42.94%。竟然在時間消耗上更低了。

class Solution {
private:vector<vector<int>> result;vector<int> path;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();}}
public:vector<vector<int>> subsets(vector<int>& nums) {result.clear();path.clear();backtracking(nums, 0);return result;}
};

這道題和之前的回溯不一樣的地方在于,所有的樹節點都是答案的一種情況,而之前的答案都是在葉子節點也就是滿足終止條件的時候。求集合冪集的方法可以無需設置終止條件。

子集II

這道題是在上面第一道題基礎上加上一個去重的操作,也就是第一次遇到元素時正常執行,但是第二次遇到相同的元素,則需要跳過。

代碼如下:

class Solution {
vector<vector<int>> ans;
vector<int> path;
void backtrack(vector<int> nums,int startIndex){ans.push_back(path);//沒有終止條件for(int i = startIndex;i<nums.size();i++){//當前層的循環if(i>startIndex && nums[i]==nums[i-1]){//不重復執行continue;}path.push_back(nums[i]);backtrack(nums,i+1);//遞歸調用下一層的函數path.pop_back();//回溯}
}
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(),nums.end());//為了把集合中相同的元素集中到一起,需要排序backtrack(nums,0);return ans;}
};

寫這一題代碼的時候,我在for循環中使用continue,以為continue是直接從if跳到循環條件判斷的地方,所以在continue前還加上了i++,導致我的代碼過了給出的測試但沒有AC。原來for循環中的contimue是跳轉到i++這個循環變量遞變的位置。

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

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

相關文章

pycharm——關于Pyqt5

PyQt5新手教程&#xff08;七萬字&#xff09; import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton, QLabel, QInputDialog, QColorDialog, QFontDialog, QFileDialog, QProgressDialog, QMessageBox from PyQt5.QtCore i…

P2678 [NOIP 2015 提高組] 跳石頭

P2678 [NOIP 2015 提高組] 跳石頭 判斷條件該怎么寫

小麥矩陣系統:一鍵批量發,多賬號同步不掉鏈

隨著互聯網的發展和社交平臺的普及&#xff0c;企業和個人用戶越來越依賴社交媒體平臺來進行信息傳播、品牌宣傳以及市場推廣。在這個信息高速流動的時代&#xff0c;如何更高效地管理多個社交平臺的賬號&#xff0c;并保持信息的同步與流暢傳播&#xff0c;成為了許多企業面臨…

JavaScript經典面試題二(函數和作用域)

目錄 一、閉包&#xff0c;使用場景 1.閉包的定義 2.閉包的實現原理 3.閉包的應用場景 &#xff08;1&#xff09;數據封裝與私有變量 &#xff08;2&#xff09;函數柯里化 &#xff08;3&#xff09;事件處理與回調 &#xff08;4&#xff09;模塊化開發 4.注意事項 …

Linux防火墻iptables

目錄 一&#xff0c;Iptables概述 二&#xff0c;iptables組成 1&#xff0c;表 2&#xff0c;鏈 3&#xff0c;鏈表對應關系 4&#xff0c;數據包過濾的匹配流程 5&#xff0c;規則匹配策略 三&#xff0c;iptables防火墻配置 1&#xff0c;iptables命令 2&#xff…

[優選算法專題二——NO.16最小覆蓋子串]

題目鏈接 LeetCode最小覆蓋子串 題目描述 代碼編寫 、關鍵注意點 僅統計目標相關字符&#xff1a;通過 hash1.count(in) 判斷字符是否在 t 中&#xff0c;避免無關字符&#xff08;如 s 中的 D、E&#xff09;干擾統計&#xff0c;提升效率。count 的更新時機&#xff1a;僅當…

考研408計算機網絡近年第34題真題解析(2021-2024.34)

&#xff08;2021.34&#xff09;此題已明確為差分曼徹斯特編碼&#xff0c;通常第一個時間間隙可能不太好判斷&#xff0c;因為0&#xff0c;或1可以變化&#xff0c;但差分曼徹斯特編碼的其它位置可以判斷&#xff0c;圖中黃色數字的時間間隙位置&#xff0c;開始位置和前面一…

微信小程序開發教程(八)

目錄&#xff1a;1.全局配置-tabBar2.小程序的頁面配置3.數據請求-GET和POST請求4.數據請求-request請求的注意事項1.全局配置-tabBar注意tabar頁面必須放到Page頭部位置2.小程序的頁面配置3.數據請求-GET和POST請求4.數據請求-request請求的注意事項

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(29):文法運用第9回3+(考え方11)

日語學習-日語知識點小記-構建基礎-JLPT-N3階段&#xff08;31&#xff09;&#xff1a;文法運用第9回31、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰2、知識點1ー 復習&#xff12;ー 單詞訓練3、單詞&#xff08;1&#xff09;日語單詞  …

小鵬汽車在 VLA(視覺 - 語言 - 動作)算法模型框架細節與原理

小鵬汽車的 VLA&#xff08;視覺 - 語言 - 動作&#xff09;算法模型框架是其端到端自動駕駛系統的核心&#xff0c;融合了多模態感知、語言推理與動作生成能力。以下是其技術細節與原理的深度解析&#xff1a; 一、整體架構&#xff1a;混合式端到端設計 小鵬 VLA 采用云端基座…

京東商品詳情 API 全解析:合規對接與 B2C 場景實戰指南

在 B2C 電商運營中&#xff0c;商品詳情數據是支撐店鋪管理、庫存調控、營銷決策的核心基礎。京東商品詳情 API 作為官方合規的數據獲取通道&#xff0c;不僅能穩定返回商品標題、價格、庫存等關鍵信息&#xff0c;還針對 B2C 場景新增了預售鎖庫、次日達標識等特色字段。本文從…

【Visual Studio 2017 和 2019下載】

Visual Studio 2017 和 2019下載VS2017下載地址&#xff1a;VS2019下載地址&#xff1a;VS2017下載地址&#xff1a; Visual Studio 2017 Community 鏈接 Visual Studio 2017 Enterprise 鏈接 VS2019下載地址&#xff1a; Visual Studio 2019 Community 鏈接 Visual Studio …

Python 輕松實現替換或修改 PDF 文字

在日常開發或文檔處理過程中&#xff0c;經常會遇到需要對 PDF 文檔中的文字進行修改的場景。例如更新合同條款、修正報表數據&#xff0c;或者批量替換文件中的特定內容。由于 PDF 格式以固定排版為特點&#xff0c;直接修改文字不像 Word 那樣直觀&#xff0c;因此需要借助專…

CI/CD流水線優化實戰:從30分鐘到5分鐘的效能革命

關鍵詞:CI/CD優化、GitHub Actions、Jenkins、自動化部署、流水線加速 一、引言:CI/CD流水線為何需要優化? 在現代軟件開發中,CI/CD(持續集成/持續交付)已成為DevOps實踐的核心環節。然而,許多團隊的流水線存在效率低下問題,??平均構建時間超過30分鐘??,嚴重制約…

神經網絡矩陣的點乘與叉乘概述

點乘點乘&#xff1a;兩個矩陣對應位置元素相乘&#xff08;逐元素級 element - wise&#xff09;實現方式&#xff1a;可通過 * 和 torch.mul(x, y) 函數實現&#xff08;含廣播機制&#xff09;模型符號&#xff1a;一個圓圈中間加一個實心點叉乘叉乘&#xff1a;傳統線性代數…

PHP學習(第三天)

網站訪問流程 一、靜態網站訪問流程&#xff08;如 index.html&#xff09;1. 流程是怎么樣的&#xff1f; 靜態網站的頁面內容固定&#xff0c;不需要服務器做額外計算&#xff0c;直接把文件返回給瀏覽器。訪問流程大致如下&#xff1a;用戶輸入網址或點擊鏈接 用戶在 個人設…

【辦公自動化】如何使用Python腳本自動化處理音頻?

在日常辦公和內容創作中&#xff0c;音頻處理是一項常見需求。無論是處理會議錄音、制作播客、編輯音樂背景&#xff0c;還是進行語音識別&#xff0c;Python都能幫助我們高效地完成這些任務。本文將介紹如何使用Python實現音頻處理自動化&#xff0c;包括格式轉換、音頻拼接、…

OpenHarmony AVSession深度解析(二):從本地會話到分布式跨設備協同的完整生命周期管理

1. 系統概述 AVSession是OpenHarmony多媒體框架中的核心組件,負責管理音視頻會話的生命周期、狀態同步和跨設備協同。它提供了統一的接口供應用創建會話、設置元數據、控制播放狀態,并支持分布式場景下的會話遷移。 2. 架構設計 2.1 核心類結構 #mermaid-svg-QwwujBwB3Wo6…

架構思維:在復雜系統中尋找秩序的底層邏輯

在商業世界中&#xff0c;架構師常被視為神秘的存在。懂架構不一定是大師&#xff0c;但&#xff0c;大師一定善于架構&#xff0c;善于撥開迷霧&#xff0c;看透全局。他們穿梭于代碼與流程之間&#xff0c;用看不見的線條編織著數字世界的經緯。 架構天然的使命就是面對復雜…

國產凝思debian系Linux離線安裝rabbitmq教程步驟

系統環境 由于國內訪問debian的apt源太慢了&#xff0c;花了很多很多時間后&#xff0c;反而超時報錯。所以采用離線安裝方式。 uname -a Linux bogon 4.19.0-11-linx-security-amd64 #1 SMP Linx 4.19.146-1linx10 (2023-05-30) x86_64 GNU/Linux下載安裝包 在有網絡的電腦…