找出{1,2,...,N}的排列数,使序列首先增加然后减少?

时间:2017-09-08 07:27:45

标签: algorithm math combinatorics counting

例如,对于N = 3。 排列是:

[1,3,2]
[2,3,1]

注意:[1,2,3][3,2,1]在此无效,因为[1,2,3]会增加,但不会减少,反之亦然[3,2,1]

我在TCS CodeVita 2017中遇到了这个问题,他们甚至没有为此提供社论。

2 个答案:

答案 0 :(得分:5)

  1. 所有这些排列在中间某处都有N
  2. 所有小于N的数字都可以分为两组:左和右。左侧组按升序排列,右侧组按降序排列。
  3. 左右组不能为空。
  4. 答案将等于不同左组的数量,因为该组应立即跟随N,所有剩余的数字将按降序排列。
  5. 左侧组可以包含N以外的所有数字。并且它既不能为空,也不能包含所有N-1个数字。
  6. 因此,答案是数字{1, 2, ..., N-1}的子集数量减去两个角落情况。那是2^(N-1) - 2

答案 1 :(得分:1)

算法如下

  1. 峰值元素始终为N
  2. N不能位于2个末端中的任何一个,所以我们可以将它放在N-2个位置
  3. 假设N位于第i个位置,我们可以选择i-1个数字位于左侧。这些将以排序的方式放置,其他元素将在N
  4. 之后以相反的顺序放置
  5. 从n = nCi中选择i个元素的方法数量,我们必须从(n-1)个元素中选择(i-1)个元素
  6. N可以是从i = 2到N-1的任何索引(假设索引从1开始)
  7. 答案是

    (n-1)C1 +(n-1)C2 +(n-1)C3 +(n-1)C4 + ....(n-1)Cn-2 = 2 ^( n-1) - 2 // -2处理n-1C0和n-1Cn-1的情况