给定一个整数列表或数组,任务是打印此列表的所有此类子序列,其中元素按升序排列。
列表中的一个子是具有相同的顺序排序的原始清单列表的元素的有序的子集。
例子:
Input: arr = {1, 2]}
Output:
2
1
1 2
Input: arr = {1, 3, 2}
Output:
2
3
1
1 2
1 3
方法:
- 在这里,我们将使用递归来查找所需的输出。
- 该函数将使用两个列表作为参数,基本条件将一直保持到列表为空。
- 在递归的每个步骤中,我们将决定是包含还是排除原始列表的特定元素。
- 为了实现这一点,我们将维护两个列表,即inp和out ,该步骤的输入和输出列表。
- 当在输出列表中包括一个元素时,我们将检查该元素是否大于输出列表中的最后一个元素,如果是,则将包括该元素。
- 当输入列表的长度变为零时,输出列表将包含所需的输出。这也是一个基本条件。
下面是上述方法的实现:
C++
// C++ implementation to store all
// increasing subsequence of the given list
#include
using namespace std;
vector>st;
// Method to find increasing subsequence
void find(vectorinp, vectorout)
{
if(inp.size() == 0)
{
if(out.size() != 0)
{
// Storing result
st.push_back(out);
}
return;
}
vectortemp;
temp.push_back(inp[0]);
// Excluding 1st element
inp.erase(inp.begin());
find(inp, out);
// Including first element
// checking the condition
// for increasing subsequence
if(out.size() == 0)
find(inp, temp);
else if(temp[0] > out[out.size() - 1])
{
out.push_back(temp[0]);
find(inp, out);
}
}
// Driver code
int main()
{
// Input list
vectorls1 = { 1, 3, 2 };
vectorls2;
// Calling the function
find(ls1, ls2);
// Printing the list
for(int i = 0; i < st.size(); i++)
{
for(int j = 0; j < st[i].size(); j++)
cout << st[i][j] << " ";
cout << endl;
}
}
// This code is contributed by Stream_Cipher
Python3
# Python3 implementation
# To store all increasing subsequence of the given list
st = []
# Method to find increasing subsequence
def find(inp, out) :
if len(inp)== 0 :
if len(out) != 0 :
# storing result
st.append(out)
return
# excluding 1st element
find(inp[1:], out[:])
# including first element
# checking the condition
# for increasing subsequence
if len(out)== 0:
find(inp[1:], inp[:1])
elif inp[0] > out[-1] :
out.append(inp[0])
find(inp[1:], out[:])
# The input list
ls1 = [1, 3, 2]
ls2 = []
# Calling the function
find(ls1, ls2)
# Printing the lists
for i in st:
print(*i)
输出:
2
3
1
1 2
1 3
时间复杂度: 。