【问题标题】:Check whether whether a subarray is in form of a mountain or not检查子数组是否为山形
【发布时间】:2021-01-16 21:05:25
【问题描述】:

问题是

你得到了一个数组,然后是一些查询

对于每个查询,您必须检查子数组是否形成山。查询将采用 [L,R] 形式,其中 L 和 R 是给定数组的索引

更多细节可以从链接中获得 https://www.google.com/amp/s/www.geeksforgeeks.org/find-whether-subarray-form-mountain-not/amp/

我想出了每个查询的蛮力方法。 但是该网站提供了更好的解决方案

我很难理解为什么该解决方案有效。 我知道子数组或任何数组都是一座山

-它应该在某些部分增加,其余部分应该减少

详细解释为什么网站中给出的解决方案有效

【问题讨论】:

    标签: arrays algorithm data-structures


    【解决方案1】:

    抱歉,如果这个答案有点太简单了。我不确定你对 DP 有多熟悉,所以想从基础开始。

    这是一个动态编程解决方案,其中preprocess() 函数中创建的leftright 数组用于以下用途:

    • 对于原始数组中的每个索引,left 存储当前值大于前一个值的最左侧索引(即山的上升部分的长度,从索引 0 开始)
    • 同样,right 存储当前值小于最后一个值的最右侧索引(即从最后一个元素开始的山的下降部分的长度)

    通过这两条信息,对于子数组中的任何索引i,您可以判断它是位于山的下降部分还是上升部分。

    如果子数组的起始索引位于升序部分,而结束索引位于降序部分,则可以进行

     return (right[L] >= left[R]);   
    

    【讨论】:

    • 我没有得到最后一部分...如何检查开始索引是否位于升序和结束索引是否位于降序...
    • 我在最后一部分的解决方案中添加了相应的行。希望有帮助!
    • 您能否详细说明为什么 right[L] >= left[R] ?
    • 好的,所以通过很少的例子我得到了直觉。但是我为使子数组成为一座山而围绕 right[L]=left[R] 工作的每一种方式我都不明白为什么需要大于等于
    猜你喜欢
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多