給定乙個整型陣列, 你的任務是找到所有該陣列的遞增子串行,遞增子串行的長度至少是2。
示例:
輸入: [4, 6, 7, 7]說明:輸出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]
給定陣列的長度不會超過15。
陣列中的整數範圍是 [-100,100]。
給定陣列中可能包含重複數字,相等的數字應該被視為遞增的一種情況。
最簡單粗暴的實現就是使用dfs得出遞增子串行,然後使用std::set對子序列排重。
**:
class solution
; }
private:
void _dfs(vector& nums, int index)
// 分支1:選擇nums[index]
if (_seq.empty() || nums[index] >= _seq.back())
// 分支2:不選擇nums[index]
_dfs(nums, index + 1);
}private:
set> _set;
vector_seq;
};
除了使用set排重,還有效率更高的排重方法。
之所以通過dfs遍歷得到的子串行可能有重複,是因為源序列中可能有重複元素。
比如對於源序列,b1=b2。
假設在某次迭代中,子串行為,當前遍歷到的元素是b2, 按照原來的解法,有兩個分支:
分支1:b2進入子串行,得到,下次從c開始繼續遍歷。
分支2:b2不進入子串行,得到,下次從c開始繼續遍歷。
其中分支2和"不選取b1,選取b2"的路徑重複。
如果避免這種重複呢?就是在執行分支2時多做乙個檢測,如果當前元素和當前子串行的尾元素相等,則不執行分支2.
比如上例中,當前元素b2和當前子串行的尾元素b1相等,所以不執行分支2。
**:
class solution
private:
void _dfs(vector& nums, int index)
// 分支1:選擇nums[index]
if (_seq.empty() || nums[index] >= _seq.back())
// 分支2:不選擇nums[index]
遞增子串行
給定乙個整型陣列,你的任務是找到所有該陣列的遞增子串行,遞增子串行的長度至少是2。解題思路 結果集cur用集合儲存,把第乙個元素以元組方式新增進來 遍歷列表,當前元素存到臨時變數nxt中 元組方式 並與cur的每個元素的最後乙個值比較,大於則新增到nxt,cur 與 nxt 並值操作,最後過濾掉長度...
最長遞增子串行
這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...
最長遞增子串行
最長遞增子串行又叫做最長上公升子串行 子串行,正如lcs一樣,元素不一定要求連續。本節討論實現三種常見方法,主要是練手。題 求乙個一維陣列arr i 中的最長遞增子串行的長度,如在序列1,1,2,3,4,5,6,7中,最長遞增子串行長度為4,可以是1,2,4,6,也可以是 1,2,4,6。方法一 d...