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..i−1
l
e
f
t
1..
i
−
1
来得出,由于每个元素最多被
left
l
e
f
t
数组跳过一次,所以计算该数组的复杂度为均摊
O(n)
O
(
n
)
。对于右侧的计算也类似,之后直接用
(righti−lefti−1)×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