高级编程技术第十三次作业

Leetcode 84. Largest Rectangle in Histogram

https://leetcode.com/problems/largest-rectangle-in-histogram/description/

题意

在一个数轴上有若干个紧挨着的长方形,每个长方形的宽都是1,第  i    i   个长方形的高为  ai    a i   ,现在要找一个面积最大的长方形,该长方形的底边和数轴平行且能够被上述长方形集合的并所覆盖。

思路

 1    1    n    n   依次枚举所有长方形。每次都假设以当前枚举到的长方形的高度作为最终选取长方形的高度,然后去找出左右最远能拓展到多远,也就是要快速的查找左(右)边第一个比当前矩阵高度要矮的长方形。
 lefti    l e f t i   表示左边第一个比当前值要小的元素的下标,  lefti    l e f t i   的值可以通过  left1..i1    l e f t 1.. i − 1   来得出,由于每个元素最多被  left    l e f t   数组跳过一次,所以计算该数组的复杂度为均摊  O(n)    O ( n )   。对于右侧的计算也类似,之后直接用  (rightilefti1)×ai    ( r i g h t i − l e f t i − 1 ) × a i   来更新答案。

代码


class Solution:
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        n = len(heights)
        if (n == 0): return 0
        left = [0] * n
        left[0] = -1
        for i in range(1, n):
            left[i] = i - 1
            while (left[i] != -1 and heights[left[i]] >= heights[i]):
                left[i] = left[left[i]]
        right = [0] * n
        right[n - 1] = n
        for i in range(n - 2, -1, -1):
            right[i] = i + 1
            while (right[i] != n and heights[right[i]] >= heights[i]):
                right[i] = right[right[i]]
        ans = 0
        for i in range(0, n):
            if ((right[i] - left[i] - 1) * heights[i] > ans):
                ans = (right[i] - left[i] - 1) * heights[i]
        return ans

Leetcode 75. Sort Colors

https://leetcode.com/problems/sort-colors/description/

题意

给出一个仅包含  0,1,2    0 , 1 , 2   的数组,要求只用一次遍历将其排序

思路

数组的最终形式一定是若干个0,若干个1,若干个2,这三段之间有两个分界点,可以通过动态维护分界点来实现一次遍历排序。一开始第一个分界点位于数组头,而第二个分界点位于数组尾,然后从头到尾遍历数组,根据遇到的数字类别决定和哪一个分界点指向的元素交换即可

代码

class Solution:
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        t1 = 0
        t2 = n - 1
        i = 0
        while (i <= t2):
            if (nums[i] == 0):
                if (i >= t1):
                    nums[i], nums[t1] = nums[t1], nums[i]
                    t1 += 1
                    i -= 1
            elif (nums[i] == 2):
                nums[i], nums[t2] = nums[t2], nums[i]
                t2 -= 1;
                i -= 1
            i += 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值