Javascript 覆盖N栋建筑的至少两个横幅的总面积
我正在执行此任务: 道路两旁矗立着N座长方形建筑 其他的。Kth大楼的尺寸为Hk×1 因为所有的建筑都在计划翻新,我们想 用长方形横幅覆盖,直到整修完成 完成了。当然,要覆盖一座建筑物,横幅必须位于 至少和大楼一样高。我们可以覆盖多个建筑物 如果宽度大于1,则使用横幅 例如,要覆盖高度为3、1、4的建筑物,我们可以使用 尺寸为4×3(即高度为4,宽度为3)的横幅,在此处标记为 蓝色: 尺寸为(3×1)、(1×1)、(4×1)的建筑物,用脚手架覆盖 尺寸为4×3 我们最多可以订购两个横幅,我们想覆盖所有的广告 建筑。此外,我们希望尽量减少所需的材料量,以 制作横幅 最多两个横幅的最小总面积是多少 建筑物的名称 编写一个函数: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 我们最多可以订购两个横幅,我们想覆
function solution(H);
给定一个由N个整数组成的数组H,返回最小值
总面积最多两个横幅,我们将不得不订购
示例:
函数解(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