遞增子串行

2021-10-02 14:44:18 字數 1447 閱讀 2292

給定乙個整型陣列, 你的任務是找到所有該陣列的遞增子串行,遞增子串行的長度至少是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...