Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 覆盖N栋建筑的至少两个横幅的总面积_Javascript_Algorithm_Data Structures - Fatal编程技术网

Javascript 覆盖N栋建筑的至少两个横幅的总面积

Javascript 覆盖N栋建筑的至少两个横幅的总面积,javascript,algorithm,data-structures,Javascript,Algorithm,Data Structures,我正在执行此任务: 道路两旁矗立着N座长方形建筑 其他的。Kth大楼的尺寸为Hk×1 因为所有的建筑都在计划翻新,我们想 用长方形横幅覆盖,直到整修完成 完成了。当然,要覆盖一座建筑物,横幅必须位于 至少和大楼一样高。我们可以覆盖多个建筑物 如果宽度大于1,则使用横幅 例如,要覆盖高度为3、1、4的建筑物,我们可以使用 尺寸为4×3(即高度为4,宽度为3)的横幅,在此处标记为 蓝色: 尺寸为(3×1)、(1×1)、(4×1)的建筑物,用脚手架覆盖 尺寸为4×3 我们最多可以订购两个横幅,我们想覆

我正在执行此任务:

道路两旁矗立着N座长方形建筑 其他的。Kth大楼的尺寸为Hk×1

因为所有的建筑都在计划翻新,我们想 用长方形横幅覆盖,直到整修完成 完成了。当然,要覆盖一座建筑物,横幅必须位于 至少和大楼一样高。我们可以覆盖多个建筑物 如果宽度大于1,则使用横幅

例如,要覆盖高度为3、1、4的建筑物,我们可以使用 尺寸为4×3(即高度为4,宽度为3)的横幅,在此处标记为 蓝色:

尺寸为(3×1)、(1×1)、(4×1)的建筑物,用脚手架覆盖 尺寸为4×3

我们最多可以订购两个横幅,我们想覆盖所有的广告 建筑。此外,我们希望尽量减少所需的材料量,以 制作横幅

最多两个横幅的最小总面积是多少 建筑物的名称

编写一个函数:

function solution(H);
给定一个由N个整数组成的数组H,返回最小值 总面积最多两个横幅,我们将不得不订购

示例:
  • 给定H=[3,1,4],函数应该返回10。结果可以通过在前两栋建筑上覆盖一个大小的横幅来实现 3×2和第三栋建筑物,其旗帜尺寸为4×1:

  • 给定H=[5,3,2,4],函数应该返回17。结果可以通过在第一栋建筑上覆盖一个大小的横幅来实现 5×1和其他带有4×3横幅的建筑物:

  • 给定H=[5,3,5,2,1],函数应该返回19。结果可以通过在前三栋建筑上覆盖一层 大小为5×3的横幅和其他两个大小为2×2的横幅:

  • 给定H=[7,7,3,7,7],函数应该返回35。使用一个大小为7×5的横幅即可获得此结果:

  • 为以下假设编写有效的算法:

    N是[1..100000]范围内的整数;数组H的每个元素 是范围[1..10000]内的整数

    以下是我尝试过的:

    函数解(H){
    设长度=H.长度;
    设maxFromLeft=[]
    设maxFromRight=[]
    maxFromLeft.length=长度+1
    maxFromRight.length=长度+1
    设currentMax=0;
    for(设i=0;i=H[i]?currentMax:H[i]
    maxFromLeft.push(当前最大值)
    }
    currentMax=0
    对于(设i=length-1;i>-1;i--){
    currentMax=currentMax>=H[i]?currentMax:H[i]
    maxFromRight.push(当前最大值)
    }
    让结果=Number.MAX_值;
    for(设i=0;i溶液([3,1,4])添加一些更改,您的代码已通过所有案例

    更改:

  • NaN的原因:您正在使用空(未定义的值)初始化数组,如下=>
  • 价值重叠:跟随trincot的评论以便更好地理解。。。对于此评估中的错误=>

  • 当使用两个横幅时,它们是否应始终并排,而不是 一个在另一个之上(上面的一个不是从另一个开始的 一楼,但在第一条横幅的高度)?——特林科特

    结果=Math.min(结果,maxFromLeft[i]*i+ maxFromRight[i]*(长度-1))

    函数解(H){
    设长度=H.长度;
    var maxFromLeft=[]
    var maxFromRight=[]
    设currentMax=0;
    对于(变量i=0;i=H[i]?currentMax:H[i]
    maxFromLeft.push(当前最大值)
    }
    currentMax=0
    对于(设i=length-1;i>-1;i--){
    currentMax=currentMax>=H[i]?currentMax:H[i]
    maxFromRight.push(当前最大值)
    }
    maxFromRight.reverse();
    让结果=Number.MAX_值;
    对于(变量i=1;i
    一些问题:

    • 产生
      NaN
      输出的原因是您初始化了两个数组的长度,这意味着您有带空插槽的数组。在这样的数组上执行
      push
      时,这些推送的值会附加在这些空插槽之后。您不应该设置那些
      length
      属性<代码>推送
    将执行必要的操作

  • maxFromRight[i]*(length-1)
    有两种错误:首先,它应该从末尾获取条目,因此如果
    i
    ,索引应该是
    length-1-i
    ,而不是
    length-1-i
    ,乘法也应该是可变的,并且有
    -i
    :它应该是
    maxFromRight[length-1-i]*(length-1-i)

  • 对于相同的
    i
    值,
    maxFromLeft[i]
    maxFromRight[i]
    的值包括对
    H[i]
    的考虑。不应该有这种重叠<代码>i
    应作为两个部分之间的清晰分割。因此,您可以定义构建
    i
    属于拆分的第二部分,而不是第一部分。要实现这一点,请确保
    maxFromLeft
    中的第一个值为0:您可以通过对语句重新排序来实现这一点

  • 我将假设横幅必须并排,而不是相互重叠

    以下是已应用修复的代码:

    函数解(H){
    设长度=H.长度;
    设maxFromLeft=[]
    设maxFromRight=[]
    //删除设置长度的线条!
    让柯尔
    
    maxFromLeft.length = length+1
    
    maxFromRight.length = length+1
    
    def solution(H):
    # case 1, 1 banner, compute 1 banner first, then see if you can reduce it
    one_banner_area = max(H)*len(H)
    
    # case 2, 2 banners
    
    #start at index 1 to avoid the checking an empty sequence
    curr_smallest = one_banner_area
    for i in range(1, len(H)):
        # use list slicing
        two_banner_area = (max(H[0:i])*len(H[0:i])) + (max(H[i:])*len(H[i:]))
    
        if two_banner_area < curr_smallest:
            curr_smallest = two_banner_area
    
    if curr_smallest < one_banner_area:
        return curr_smallest
    else:
        return one_banner_area
    return 0