【问题标题】:Find the number of ways to partition the array找出对数组进行分区的方法数
【发布时间】:2017-06-24 20:31:57
【问题描述】:

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

例如, 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种分区方式。

我尝试了递归方法,但由于超出时间限制而终止。此外,这种方法并不总是提供正确的输出。

在另一种方法中,我采用数组,按降序对其进行排序,然后对于每个元素,我检查天气,它位于原始数组的右侧,如果确实如此,则将其分区添加到它之前的数字中。

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

【问题讨论】:

  • 您需要做的第一件事是选择合适的变量名称。
  • 这里的失败是指它没有达到预期的时间限制。它应该花费更多的时间。正如标签所暗示的,我想降低它的时间复杂度。
  • 那这个需要去Code Review
  • @Daemon 请不要在此处询问有关在线代码判断引擎的问题。任何人都不太可能从他们的测试用例中告诉你你失败的地方,因为这些通常不会被披露。即使您测试的是在本地环境中运行,您也可能错过了测试在线挑战中应用的一些边缘案例。要有创意并尝试找到它们。此外,从长远来看,这些问题可能没有任何价值,除了在在线比赛中作弊,什么都学不到。
  • “此外,这种方法并不总是提供正确的输出。”但是“我的代码正在做它应该做的事情,它表现得很好”这两种说法都不正确。是哪个?

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


【解决方案1】:

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

  • 首先,检查 [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]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多