中选择 n/2 个元素,以先减后增的方式打印所有子序列

原文:

给定一个正整数 n ,任务是通过从 1n 中选择 ceil(n/2) 元素,以先减后增的方式打印的所有子序列。

示例:

输入: n = 5 输出: (2,1,3),(2,1,4),(2,1,5),(3,1,2),(3,1,4),(3,1,5),(3,2,4),(3,2,5),(4,1,2), (4,1,3),(4,1,5),(4,2,3),(4,2,5),(4,2,5),(4,3,5),(5,1,2),(5,1,3),(5,5),(5,3,5) 这些是大小为 3 的有效序列,先减少后增加。

方法:该方法基于使用 python 的内置函数来生成大小 ceil(n/2)的所有子序列。按照以下步骤解决问题:

  • 初始化一个 arr[] ,插入从 1n 的所有元素。
  • 将变量 k 初始化为上限(n/2)
  • 使用名为
  • 使用变量序列迭代数组 序列,并执行以下步骤:
    • 检查 seq[1] > seq[0]seq[-1] < seq[-2]seq 是增加还是减少,然后继续,否则该序列不满足上述条件。
    • 如果元素多于 seq[i] < seq[i-1]seq[i] < seq[i 1] 那么也继续,不打印数组。
    • 如果序列没有遵循以上任何一点,则打印序列

下面是上述方法的实现:

python 3

# python3 program for the above approach
# import the ceil permutations in function 
from math import ceil
# function to generate all the permutations
from itertools import permutations
# function to check if the sequence is valid
# or not
def validsubsequence(seq):
  # if first element is greater or last second
  # element is greater than last element
  if (seq[0]seq[i   1]:
      pass
    elif seq[i]seq[j   1]):
        return false
    i = 1
   # if the sequence do not follow above condition
   # return true
  return true 
# driver code
n = 5
k = ceil(n / 2)
arr = list(range(1, n   1))
# generate all permutation of size n / 2 using
# default function
sequences = list(permutations(arr, k))
# print the sequence which is valid valley subsequence
for seq in sequences:
  # check whether the seq is valid or not 
  # function call
  if validsubsequence(seq):
    print(seq, end =" ")

output:

(2, 1, 3) (2, 1, 4) (2, 1, 5) (3, 1, 2) (3, 1, 4) (3, 1, 5) (3, 2, 4) (3, 2, 5) (4, 1, 2) (4, 1, 3) (4, 1, 5) (4, 2, 3) (4, 2, 5) (4, 3, 5) (5, 1, 2) (5, 1, 3) (5, 1, 4) (5, 2, 3) (5, 2, 4) (5, 3, 4)

时间复杂度:o(cnt5】n/2 ceil(n/2)!n) 辅助空间:o(cnn/2 ceil(n/2)!)*