• leetcode 84 golang


    原题链接

    leetcode web address

    题目概述

    在一个直方图中, 找到最大的矩形.

    解题思路

    我一开始想到的解题方法是通过分治的方法进行排序.方法如下,首先找到最小的数字,那么这个最小高度的矩形可以算出,然后分别计算它的左边的部分,和右边的部分,三者之间取最大值.
    这种方法的算法复杂度是O(nlogn),极端情况是O(n2).
    然后挂了,再参考别人的思路后终于写了出来QAQ.
    正确的解题方法是构造一个递增的栈,每当有新的数据进来时.进行比较,如果比栈顶小的话,就出栈算面积.
    值得注意的地方有两个:
    1, 就是低高低的情况,所以矩形的长度还要向前计算.所以矩形宽度还要看前一个的索引.如果已经是第一个就要全部计算在内.
    2,就是连续相同高度的情况,如果出现这种情况解决方法有2,一个是让其进栈,一个是永远只取最后一个值进行计算.
    为了便于计算我在这个序列的尾巴增加了一个0高度.

    代码

    func largestRectangleArea(heights []int) int {
        var result int
        result = 0
        tmpResult := 0
    
        heights = append(heights, 0)
        heightIndex := make([]int, 0)
    
        tmpValue := 0
        tmpIndex := 0
    
        for index, value := range heights {
            for {
                if len(heightIndex) == 0 || value >= heights[heightIndex[len(heightIndex) - 1]] {
                    heightIndex = append(heightIndex, index)
                    break
                } else {
                    if len(heightIndex) == 1 {
                        tmpIndex = -1
                    } else {
                        tmpIndex = heightIndex[len(heightIndex) - 2]
                    }
                    tmpValue = heights[heightIndex[len(heightIndex) - 1]]
                    tmpResult = (index - tmpIndex - 1) * tmpValue
                    if result < tmpResult {
                        result = tmpResult
                    }
    
                    heightIndex = heightIndex[:len(heightIndex) - 1]
                }
            }
        }
        return result
    }
    
  • 相关阅读:
    QT 捕获事件(全局拦截)
    QT语言翻译
    QT,QLabel添加超链接
    解决VS+Qt不生成moc文件问题
    c++编译错误:invalid new-expression of abstract class type
    C++ 异常处理
    MATLAB 随机生成互不重叠的多个矩形
    sequential minimal optimization,SMO for SVM, (MATLAB code)
    How to decide on the correct number of clusters?
    python 将数据随机分为训练集和测试集
  • 原文地址:https://www.cnblogs.com/mangmangbiluo/p/13264368.html
Copyright © 2020-2023  润新知