代碼隨想錄第天 78.子集 90.子集II

LeetCode 78 子集

題目描述

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

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

示例 1:

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

示例 2:

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

思路

????????這道題目和普通的回溯問題的區別在于,每加入一次新的元素都要將結果加入result數組中,而不是需要判斷path數組中的元素是否達到題目要求的標準,才加入result數組,所以做出的改變就是,在for循環的過程中,每一次循環都需要加當前的數組加入result中。

代碼實現

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

LeetCode 90 子集II?

題目描述

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

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

示例 1:

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

示例 2:

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

思路

? ? ? ? 子集一問題和子集二問題的區別在于子集二需要進行剪枝。而如何進行剪枝和前面的組合問題是一樣的步驟。要去重的是“同一樹層上的使用過”,如何判斷同一樹層上元素(相同的元素)是否使用過了呢。

如果nums[i] == nums[i - 1]?并且?used[i - 1] == false,就說明:前一個樹枝,使用了nums[i - 1],也就是說同一樹層使用過nums[i - 1]

此時for循環里就應該做continue的操作。

這塊比較抽象,如圖:

40.組合總和II1

可以看出在nums[i] == nums[i - 1]相同的情況下:

  • used[i - 1] == true,說明同一樹枝nums[i - 1]使用過
  • used[i - 1] == false,說明同一樹層nums[i - 1]使用過

used[i - 1] = false說明已經進入另一個樹枝,所以前一個數才會被跳過,沒有遍歷到。而 used[i - 1] == true,說明是進入下一層遞歸,去下一個數,所以是樹枝上,如圖所示:

代碼實現

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,int startindex,vector<bool>& used){if(path.size() == 0) result.push_back(path);if(path.size() == nums.size()) return;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]);result.push_back(path);used[i] = true;backtracking(nums,i + 1,used);path.pop_back();used[i] = false;}return;}vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<bool> used(nums.size(),false);sort(nums.begin(),nums.end());backtracking(nums,0,used);return result;}
};

?LeetCode 491 非遞減子序列

題目描述

給你一個整數數組?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]]

思路

  • 遞歸函數參數

本題求子序列,很明顯一個元素不能重復使用,所以需要startIndex,調整下一層遞歸的起始位置。

代碼如下:

vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums, int startIndex)
  • 終止條件

本題其實類似求子集問題,也是要遍歷樹形結構找每一個節點,所以可以不加終止條件,startIndex每次都會加1,并不會無限遞歸。

但本題收集結果有所不同,題目要求遞增子序列大小至少為2,所以代碼如下:

if (path.size() > 1) {result.push_back(path);// 注意這里不要加return,因為要取樹上的所有節點
}
  • 單層搜索邏輯

491. 遞增子序列1

?在圖中可以看出,同一父節點下的同層上使用過的元素就不能再使用了。這里避免重復的思路是使用一個unoedered set去判斷某一數字在當前樹層是否使用過。

那么單層搜索代碼如下:

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();
}

代碼實現

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,int startindex){if(path.size() > 1){result.push_back(path);}unordered_set<int> uset;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/news/711285.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711285.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711285.shtml

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

相關文章

LeetCode 2581.統計可能的樹根數目:換根DP(樹形DP)

【LetMeFly】2581.統計可能的樹根數目&#xff1a;換根DP(樹形DP) 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 個節點的樹&#xff0c;節點編號為 0 到 n - 1 。樹用一個長度為 n - 1 的二維整數數組 edges…

debian/ubuntu 編譯安裝nginx php

debian/ubuntu 編譯安裝nginx php tar -zxvf nginx-1.9.9.tar.gz apt-get install libpcre3 libpcre3-dev ./configure --prefix/work/nginx-1.9.9 --with-pcre make make install service iptables stop #關閉防火墻, 可能不需要 修改nginx運行用戶為tboqi 抱著log目錄可…

【通信基礎知識】完整通信系統的流程圖及各模塊功能詳解

2024.2.29 抱歉最近在寫畢設大論文&#xff0c;因此沒有太多時間更新。然而&#xff0c;在寫論文的過程中&#xff0c;發現自己對通信系統的了解還不夠全明白&#xff0c;因此差了一些碩博論文總結了一個完整的通信系統流程圖。若有不對的地方請多多指正//部分內容有參考ChatGP…

【Elasticsearch管理】網絡配置

文章目錄 HTTP高級網絡設置高級TCP設置 TransportTCP傳輸概要文件Transport跟蹤 線程池fixed線程池fixed_auto_queue_sizescaling處理器設置 HTTP Elasticsearch只在默認情況下綁定到本地主機。對于運行本地開發服務器(如果在同一臺機器上啟動多個節點&#xff0c;甚至可以運行…

YOLOv7基礎 | 第2種方式:簡化網絡結構之yolov7.yaml(由104層簡化為30層)

前言:Hello大家好,我是小哥談。通過下載YOLOv7源碼可知,原始的yolov7.yaml文件是拆開寫的,比較混亂,也不好理解,并且為后續改進增添了很多困難。基于此種情況,筆者就給大家介紹一種將yolov7.yaml文件簡化的方法,將104層簡化為30層,并且參數量和計算量和原來是一致的,…

內存占用構造方法

#使用虛擬內存構造內存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #釋放消耗的虛擬內存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #內存占用可直接在/dev/shm目錄下寫文件

《極客時間 - 左耳聽風》【文章筆記個人思考】

《極客時間 - 左耳聽風》原文鏈接&#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 這里的Leader是在技術上取得優勢&#xff0c;而不是行政…

2024年2月個人工作生活總結

本文為 2024年2月工作生活總結。 研發編碼 一些警告修正記錄 這個月修正了個人所負責的工程警告&#xff0c;這些警告其實是前人的代碼遺留的&#xff0c;我續寫的代碼&#xff0c;除printf函數的%d、%ld格式&#xff0c;都在寫的過程中改了。 下面記錄一些典型的警告及應對…

NLP(一)——概述

參考書: 《speech and language processing》《統計自然語言處理》 宗成慶 語言是思維的載體&#xff0c;自然語言處理相比其他信號較為特別 word2vec用到c語言 Question 預訓練語言模型和其他模型的區別? 預訓練模型是指在大規模數據上進行預訓練的模型&#xff0c;通常…

測試環境搭建整套大數據系統(七:集群搭建kafka(2.13)+flink(1.13.6)+dinky(0.6)+iceberg)

一&#xff1a;搭建kafka。 1. 三臺機器執行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下倆內容 1.三臺機器分別給予各自的broker_id…

git操作學習記錄,簡單易上手

配置git 的賬戶郵箱 $ git config --global user.name "Firstname Lastname" $ git config --global user.email "your_emailexample.com"代碼回溯 git rest --hard [commit哈希值]git log命令只能查看以當前狀態為終點的歷史日志 git reflog命令&#x…

Python+neo4j構建豆瓣電影知識圖譜

文章目錄 數據來源數據整理導入節點和關系導入使用Subgraph批量導入節點和關系 多標簽實體和實體去重 數據來源 http://www.openkg.cn/dataset/douban-movie-kg 該網址擁有豐富的中文知識圖譜數據集&#xff0c;OpenKG(Open Knowledge Graph)&#xff0c;可供研究人員使用研究…

【golang】25、圖片操作

用 “github.com/fogleman/gg” 可以畫線, 框 用 “github.com/disintegration/imaging” 可以變換顏色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

Python爬蟲——Urllib庫-3

目錄 ajax的get請求 獲取豆瓣電影第一頁的數據并保存到本地 獲取豆瓣電影前十頁的數據 ajax的post請求 總結 ajax的get請求 獲取豆瓣電影第一頁的數據并保存到本地 首先可以在瀏覽器找到發送數據的接口 那么我們的url就可以在header中找到了 再加上UA這個header 進行請…

Facebook的元宇宙實踐:數字化社交的新前景

近年來&#xff0c;元宇宙&#xff08;Metaverse&#xff09;這一概念備受矚目&#xff0c;被認為是數字化社交的未來趨勢之一。而在眾多科技巨頭中&#xff0c;Facebook&#xff08;現更名為Meta&#xff09;一直處于元宇宙發展的前沿。在本文中&#xff0c;我們將深入探討Fac…

萬字帶你走過數據庫的這激蕩的三年

本文收集了卡內基梅隆大學計算機科學系數據庫學副教授 Andy Pavlo 從 2021 到 2023 連續三年對數據庫領域的回顧&#xff0c;希望通過連續三年的回顧讓你對數據庫領域的技術發展有所了解。 關于 Andy Pavlo&#xff1a;卡內基梅隆大學計算機科學系數據庫學副教授&#xff0c;數…

vuepress項目側邊欄菜單配置使用

第一種菜單配置&#xff0c;自定義菜單名稱 {text: 菜單名稱,// 是否折疊collapsible: true,children: [{text: "自定義md菜單名稱",sidebarDepth: 2,link: "/xxx/aa.md",children: [],}],},第二種菜單配置 標題自動生成菜單&#xff0c;使用需要搭配sideb…

c語言求矩陣的局部極大值

給定M行N列的整數矩陣A&#xff0c;如果A的非邊界元素A[i][j]大于相鄰的上下左右4個元素&#xff0c;那么就稱元素A[i][j]是矩陣的局部極大值。本題要求給定矩陣的全部局部極大值及其所在的位置。 輸入格式&#xff1a; 輸入在第一行中給出矩陣A的行數M和列數N&#xff08;3≤…

C語言創建結構體時 什么時候需要C++引用 什么情況下下不需要引用

在C語言中&#xff0c;結構體通常通過傳遞指針來實現對結構體的修改。當在函數中需要修改結構體的內容&#xff0c;并且希望這些修改在調用函數后仍然保持&#xff0c;可以考慮使用指針。引用是C中的一種特殊機制&#xff0c;用于更方便地傳遞參數&#xff0c;但在純粹的C語言中…

《springcloud alibaba》 三 sentinel流量控制

目錄 sentinel準備流控規則 qpspom.xmlapllication.yml啟動類controller查看結果流控提示不太友好 流控規則 線程數全局異常處理pom.xmlapplication.yml啟動類實體類controller類異常類測試 關聯流控模式關聯jmeter 鏈路servicecontroller代碼調整 流控效果Warm UP 熔斷降級規則…