找到分区数组的方法数

时间:2017-06-24 20:31:57

标签: c++ arrays performance dynamic time-complexity

我想要多种方法来划分一个正整数组,使得数组左边部分的最大值大于或等于数组右边部分的最大值。

例如, 6 4 1 2 1可分为:

[[6,4,1,2,1]] [[6][4,1,2,1]] [[6,4][1,2,1]] [[6,4,1][2,1]] [[6,4,1,2][1]] [[6][4,1][2,1]] [[6][4][1,2,1]] [[6][4][1,2][1]] [[6][4,1,2][1]] [[6,4,1][2][1]] [[6][4,1][2][1]] [[6,4][1,2][1]]

共有12种分区方式。

我尝试了一种递归方法,但由于超出时间限制而导致终止失败。此方法也不能始终提供正确的输出。

在另一种方法中,我采用了数组,按递减顺序对其进行排序,然后对于每个元素,我检查天气它位于原始数组的右侧,如果是,则将它的分区添加到其中&#39 ;之前的数字也是。

我想要一种方法来解决这个问题,任何实现或伪代码或只是一个想法来做到这一点都会很明显。

1 个答案:

答案 0 :(得分:0)

我设计了一个简单的递归算法。我会尝试解释你的例子;

  • 首先,检查[6]是否是分区的可能/有效部分。
  • 这是一个有效的分区,因为([6])的最大元素大于剩余部分([4,1,2,1])的最大值。
  • 由于它是一个有效的分区,我们可以使用算法的递归部分。

    concatenate([6],algorithm([4,1,2,1]))
    
  • 现在分区

    [[6][4,1,2,1]], [[6][4,1][2,1]], [[6][4,1][2,1]] [[6][4][1,2,1]] [[6][4][1,2][1]] [[6][4,1,2][1]] 
    

    在我们当前的解决方案集中。

  • 检查[6,4]是否是分区的可能/有效部分。

  • 继续这样直到[6,4,1,2,1]。