华为软件机考826第二题思路

华为笔试第二道题目考察的是单调栈,奈何笔试紧张的一塌糊涂没写出来,冷静下来写写思路,希望下次在遇到类似的题目可以写出来~如果代码有问题欢迎指正呀.

题目:
一个仓库摆放了一排连续整齐的长宽不等的矩形箱子,现在要在这些高低不等的箱子
组成的柱状图中找到最大的一块完整矩形面积来张贴一张海报。简而言之,求最大矩形。

输入:egg:[1,1,1,1,2,1,1],[5,2,5,4,5,1,6]
输出:16

同类型题目:leetcode84

我的思路为首先把输入进行处理,生长一个每个宽度为1,高度为对应高的数组,然后再利用单调栈的思路求解。单调栈思路:

从左向右遍历,当当前位置i的高度小于前一高度的话,说明右边界为i-1,左边界为弹出stack中最后一个数后的索引值,计算当前最大面积,直到不满足小于时候,栈内压入索引i。

#输入处理
in_str = input()
#处理左括号 右括号以及分割
id =[]
for i in range(len(in_str)):
    if in_str[i] in ['[', ']']:
        id.append(i)
in_str = in_str.replace('[','')
in_str = in_str.replace(']','')
nums = [int(str_num) for str_num in in_str.split(',')]
#函数定义
def create_nums(nums):
    ws, hs = nums[:len(nums)//2], nums[len(nums)//2:]
    new_hs = []
    for i in range(len(ws)):
        new_hs += [hs[i]]*ws[i]
    return new_hs
def max_area(height):
    stack = [-1]
    res = 0
    height = height+[0]
    for i in range(len(height)):
        while len(stack)>1 and height[i]<height[stack[-1]]:
            res = max(res, height[stack.pop()]*(i-1-stack[-1]))
        stack.append(i)
    return res
#调用函数
def main():
    if min(nums)<=0 or len(nums)&1==1 or id[1]-id[0]!=id[3]-id[2]:
        return 0
    else:
        hs = create_nums(nums)
        res = max_area(hs)
        return res
print(main())
#笔试题目##华为#
全部评论
这个题我直接暴力法做的,考虑几个边界情况后,也能AC
点赞 回复
分享
发布于 2020-08-27 21:31

相关推荐

1 19 评论
分享
牛客网
牛客企业服务