我一直在努力解決增加的子序列問題。我提出的算法目前只解決了排序後的數組。我在python 3.5中編寫我的代碼。此問題在Leetcode上託管。如何提高增加子序列算法以合併未排序的數組?
在遞增子問題,我給定一個整數數組,任務是找到給定陣列的所有不同的可能增加子序列,和增加的子序列的長度應至少爲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]]
這是我的解決這個問題的工作代碼:
array = [4,6,7,7]
def incrSubseq(array): #Only works for sorted arrays.
res = [[]]
ans = []
for num in array:
res += [item + [num] for item in res if (item+[num] not in res)]
for values in res:
if len(values)>1:
ans = ans + [values]
print(ans)
incrSubseq(array)
此代碼是如何工作的?
- 它開始通過初始化一個結果變量
res
(列表的列表) 其通過一個空列表初始化。 - 然後,我遍歷給定的整數數組
array
,它按照排序順序,將每個元素添加到列表中,從而找到可以形成的所有子集。列表理解中的if
語句過濾掉重複的項目,因此只保留列表的一個副本。 - 然後我過濾所有其具有的長度大於1
因此,解決該問題的陣列。
現在,我在這裏失蹤的是解決未排序數組的方法。據我的理解,我需要檢查的方式,當我試圖添加一個元素到res
它應該大於或等於它之前的項目。
res += [item + [num] for item in res if (item+[num] not in res) and (item <= num)]
它在空列表中給出。
關於改進代碼的任何建議?
你能解釋一下如何'LEN(項目)一點點== 0'改變了一切。我不太清楚短路。 – Prerit
另外我的代碼沒有優化。 'array = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]'需要很長時間。由於我正在生成所有的子集,它將是一個指數複雜度代碼。 O(n^n)我想。 – Prerit
@Prerit更新了我的答案。 – Hannes