leetcode 491. 遞增子序列 思考分析

題目

給定一個整型數組, 你的任務是找到所有該數組的遞增子序列,遞增子序列的長度至少是2。
在這里插入圖片描述
說明:
給定數組的長度不會超過15。
數組中的整數范圍是 [-100,100]。
給定數組中可能包含重復數字,相等的數字應該被視為遞增的一種情況。

思考

這一題和leetcode 90. 子集 II 思考分析的思想有點像。
但是需要注意的是:
1、該數組是求遞增子序列,所以不能打亂原數組的順序。
2、遞增子序列
3、遞增子序列的長度最少是2
其它的思想:回溯、去重其實和leetcode 90. 子集 II 思考分析是一樣的。
對于上面兩個問題,我們可以這也解決:
1、我們之前排序的是為了使相同的元素靠到一起,然后通過判斷元素是否出現過來去重:

if(i > start && nums[i] == nums[i-1]) continue;

既然是判斷元素是否出現過,那么我們就可以使用哈希法,注意這里判斷的是解空間樹本層是否出現重復元素,所以去重操作仍然是在for循環中:

unordered_set<int> set;
for(int i=start;i<end;i++)
{//如果在本層重復使用了某個元素,那么跳過if(set.find(nums[i])!=set.end()) continue;set.insert(nums[i]);//剩下的回溯代碼}

2、遞增序列如何判斷:
只要在本層for循環中檢查該元素是否大于子序列的最后一個元素即可:

//如果元素小于子序列的最后一個元素
if(res.size()>=1 && nums[i]<res[res.size()-1]) continue;

注意這個continue操作應該在上一個哈希法去重之前。
3、遞增子序列的長度最少是2,在將res送入result之前先進行判斷一下

if(res.size()>=2) result.push_back(res);

至此,我們這個問題就解決差不多了。
下面是整個代碼:

代碼

注意這里的floor是為了調試看層數的,所以可以不使用這個變量。

class Solution {
public:vector<vector<int>> result;vector<int> res;int floor=0;void backtracking(vector<int>& nums,int start,int end){if(res.size()>=2) result.push_back(res);//剩余集合為空,返回if(start>=end){return;}unordered_set<int> set;for(int i=start;i<end;i++){//如果元素小于子序列的最后一個元素if(res.size()>=1 && nums[i]<res[res.size()-1]) continue;//如果在本層重復使用了某個元素if(set.find(nums[i])!=set.end()) continue;set.insert(nums[i]);//cout<<nums[i]<<"層數:"<<floor<<endl;//處理結點;res.push_back(nums[i]);floor++;//遞歸,探索下一層backtracking(nums,i+1,end);		//遞歸floor--;//回溯,撤銷處理結果res.pop_back();}return;}vector<vector<int>> findSubsequences(vector<int>& nums) {result.clear();res.clear();floor=0;backtracking(nums,0,nums.size());return result;}
};

優化

對于本層元素是否重復使用我們使用了set,題目中限定了數值范圍[-100,100]所以可以用數組來做哈希表。
因為對set的insert操作需要做哈希映射相對耗費時間,并且每次重新定義set,insert的底層符號表也要做擴充。

class Solution {
public:vector<vector<int>> result;vector<int> res;int floor=0;void backtracking(vector<int>& nums,int start,int end){if(res.size()>=2) result.push_back(res);//剩余集合為空,返回if(start>=end){return;}int usedArray[201]={0}; //這里使用數組來進行去重操作。for(int i=start;i<end;i++){//如果元素小于子序列的最后一個元素if(res.size()>=1 && nums[i]<res[res.size()-1]) continue;//如果在本層重復使用了某個元素if(usedArray[nums[i]+100] ==1) continue;usedArray[nums[i]+100] =1;//cout<<nums[i]<<"層數:"<<floor<<endl;//處理結點;res.push_back(nums[i]);floor++;//遞歸,探索下一層backtracking(nums,i+1,end);		//遞歸floor--;//回溯,撤銷處理結果res.pop_back();}return;}vector<vector<int>> findSubsequences(vector<int>& nums) {result.clear();res.clear();floor=0;backtracking(nums,0,nums.size());return result;}
};

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

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

相關文章

八、神經網絡

一、為啥要有神經網絡&#xff1f; 在前面的幾篇博客中&#xff0c;很容易知道我們處理的都是線性的數據&#xff0c;例如&#xff1a;線性回歸和邏輯回歸&#xff0c;都是線性的算法 但是&#xff0c;實際上日常生活中所遇到的數據或者問題絕大多數還是非線性的 一般面對非線…

scale up 和 scale out

目前在調研sheepdog的時候&#xff0c;看到scale up和scale out的術語&#xff0c;理解了一下&#xff1a; 這兩個詞匯均是存儲系統方面的概念 scale up: 縱向擴展 購買更大的存儲&#xff0c;遷移原有數據到大的存儲中 &#xff08;添加新一個新的機器&#xff09; scale out…

icse ccf_ICSE的完整形式是什么?

icse ccfICSE&#xff1a;印度中學教育證書 (ICSE: Indian Certificate of Secondary Education) ICSE is an abbreviation of the Indian Certificate of Secondary Education (ICSE). It is an educational board of the school in India for class 10th which is private an…

Delphi XE2 之 FireMonkey 入門(18) - TLang(多語言切換的實現)

一個小小的 TLang 類, 實現多語言切換, 挺好的. 它的工作思路是:1、首先通過 AddLang(語言代碼) 添加語言類別, 如: AddLang(en)、AddLang(cn).2、每個語言代碼對應一個 TStrings 列表, 獲取方式如: LangStr[en]、LangStr[cn].3、可以手動填充這些數據、可以通過 LoadFromFile(…

leetcode 46. 全排列 思考分析

目錄1、題目2、思考3、優化1、題目 給定一個 沒有重復 數字的序列&#xff0c;返回其所有可能的全排列。 2、思考 老規矩&#xff0c;先畫出給出的例子的解空間樹&#xff1a; 觀察我們可以發現&#xff1a; 1、深度向下一層深入時&#xff0c;出現過的元素不能再出現&…

Arduino UNO R3開發板+MQ-2煙霧濃度傳感器+火焰傳感器+舵機+無源蜂鳴器+風扇+步進電機+WIFI模塊+RGB三色LED燈+SIM900A所構成的室內安全報警模塊

該系統模塊主要由Arduino UNO R3開發板MQ-2煙霧濃度傳感器火焰傳感器舵機無源蜂鳴器風扇步進電機WIFI模塊RGB三色LED燈SIM900A所組成&#xff0c;MQ-2煙霧濃度傳感器達到不同的閾值的時候&#xff0c;LED燈會通過不同的顏色來進行警示。煙霧濃度增大&#xff0c;LED燈依次顯示綠…

highcharts中series帶參數的賦值問題

需要得到的代碼如下&#xff1a; series: [{name: 棒號1,data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]}, {name: 棒號2,data: [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]}, {name: 棒號3,data: [-0.9, 0.6, 3.5, …

可編程ic卡 通用嗎_8255可編程IC

可編程ic卡 通用嗎Introduction 介紹 An 8255 programmable integrated circuit (IC) is an IC used for interfacing the microprocessor with the peripheral devices. It is a 40 pin IC which was introduced by INTEL to use with its 8085 and 8086 microprocessors. 82…

POJ 1944 Fiber Communications (枚舉 + 并查集 OR 線段樹)

題意 在一個有N&#xff08;1 ≤ N ≤ 1,000&#xff09;個點環形圖上有P&#xff08;1 ≤ P ≤ 10,000&#xff09;對點需要連接。連接只能連接環上相鄰的點。問至少需要連接幾條邊。 思路 突破點在于最后的結果一定不是一個環&#xff01;所以我們枚舉斷邊&#xff0c;則對于…

九、邏輯回歸多分類和softmax多分類

一、邏輯回歸多分類 假設激活函數使用的是sigmoid函數 邏輯回歸多分類其實是多個二分類而已&#xff0c;若求三分類問題需要對訓練的數據樣本進行適當的修改調整即可&#xff0c;如何修改樣本數據可以參考邏輯回歸二分類和多分類本質區別&#xff0c;內容都一樣&#xff0c…

【C++grammar】繼承與構造test1代碼附錄

目錄1、main.cpp2、circle.cpp3、circle.h4、rectangle.cpp5、rectangle.h6、Shape.h1、main.cpp #include <iostream> #include <string> #include "Shape.h" #include "circle.h" #include "rectangle.h"//創建Shape/Circle/Rect…

hdu 4747 mex 線段樹+思維

http://acm.hdu.edu.cn/showproblem.php?pid4747 題意&#xff1a; 我們定義mex(l,r)表示一個序列a[l]....a[r]中沒有出現過得最小的非負整數&#xff0c; 然后我們給出一個長度為n的序列&#xff0c;求他所有的連續的子序列的mex(l,r)的和。 思路&#xff1a; 首先因為n的最大…

十、評估指標

我看過很多課程&#xff0c;不過內容都大差不差&#xff0c;也可以參考這篇模型評估方法 一、K折交叉驗證 一般情況&#xff0c;我們得到一份數據集&#xff0c;會分為兩類&#xff0c;一類是trainset訓練集&#xff0c;另一類十testset測試集。通俗一點也就是訓練集相當于平…

leetcode 47. 全排列 II 思考分析

題目 給定一個可包含重復數字的序列 nums &#xff0c;按任意順序 返回所有不重復的全排列。 思考分析以及代碼 這一題和前面的做過的兩個題目有所關聯&#xff1a; leetcode 46. 全排列 思考分析 再加上leetcode 491. 遞增子序列 思考分析類似的去重操作。 先畫出解空間樹…

python添加數組元素_在Python中向數組添加元素

python添加數組元素An array can be declared by using "array" module in Python. 可以通過在Python中使用“數組”模塊來聲明數組 。 Syntax to import "array" module: 導入“數組”模塊的語法&#xff1a; import array as array_alias_nameHere, im…

hdu 4472 Count(遞推即dp)

題目鏈接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4472 代碼&#xff1a; #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include <queue> #include <vector> …

如何在Java中同步ArrayList?

同步ArrayList (Synchronizing ArrayList) In java, there are two ways to synchronize ArrayList, 在Java中&#xff0c;有兩種同步ArrayList的方法&#xff0c; With the help of synchronizedList() method 借助syncedList()方法 With the help of CopyOnWriteArrayList&l…

十一、決策樹和隨機森林

這門課和另一門課內容都差不多&#xff0c;可以參考七、決策樹算法和集成算法該篇博文。 一、決策樹相關概念 邏輯回歸本質 邏輯回歸&#xff1a;線性有監督分類模型。常用求解二分類問題&#xff0c;要么是A類別要么是B類別&#xff0c;一般會以0.5作為劃分閾值&#xff0c…

【C++grammar】繼承與構造

目錄1.繼承1、Inheritance (繼承)2、避免一個類被繼承&#xff08; C11 &#xff09;3、繼承實例4、完整代碼5、繼承的優缺點是什么?2.繼承中的構造函數1、 派生類繼承的成員2、調用基類構造函數3.繼承中的默認構造函數1、基類的無參構造函數2、由編譯器自動生成的基類構造函數…

C語言預處理

所謂預處理是指在進行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。預處理是&#xff23;語言的一個重要功能&#xff0c; 它由預處理程序負責完成。當對一個源文件進行編譯時&#xff0c; 系統將自動引用預處理程序對源程序中的預處理部分作處理&#xff0c; 處理完畢…