窮舉+判斷函數求Lis
程式碼
def is_increasing(subset):
"""判斷子集是否為遞增"""
return all(subset[i] < subset[i + 1] for i in range(len(subset) - 1))
def all_increasing_subsets(arr):
n = len(arr)
subsets = []
# 透過位元表示法窮舉所有子集
for i in range(2**n):
subset = []
for j in range(n):
if i & (1 << j): # 檢查第 j 位是否為 1
subset.append(arr[j])
# 僅保留遞增子集
if is_increasing(subset):
subsets.append(subset)
return subsets
# 測試輸入
arr = [2, 4, 6, 5, 3, 1]
# 計算所有遞增子集
increasing_subsets = all_increasing_subsets(arr)
# 輸出結果
print("所有遞增子集:")
for subset in increasing_subsets:
print(subset)
程式邏輯
判斷函數
is_increasing
:- 接收子集作為輸入。
- 使用
all()
函數檢查子集中每對相鄰元素是否滿足遞增條件subset[i] < subset[i + 1]
。 - 如果所有條件都滿足,則返回
True
,否則返回False
。
修改子集生成邏輯:
- 在原先生成所有子集的基礎上,加入對
is_increasing
的檢查。 - 僅保留符合遞增條件的子集。
- 在原先生成所有子集的基礎上,加入對
結果存儲:
- 將所有遞增子集存入
subsets
,最後返回。
- 將所有遞增子集存入
範例輸出
對於輸入 arr = [2, 4, 6, 5, 3, 1]
:
所有遞增子集:
[]
[2]
[4]
[6]
[2, 4]
[2, 6]
[4, 6]
關鍵點
效率考量:
- 總共生成 (2^n) 個子集,對每個子集進行遞增檢查,總時間複雜度為 (O(n \cdot 2^n))。
可擴展性:
- 判斷函數
is_increasing
可修改為其他條件(如遞減、相等等),滿足不同需求。
- 判斷函數
適用場景:
- 適合處理需要過濾特定條件的子集問題。
沒有留言:
張貼留言