【LeetCode】力扣刷题之路
题目(20240722~20240726)
面试题 16.16. 部分排序
给定一个整数数组,编写一个函数,找出索引m和n,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的m和n(例如整个数组是有序的),请返回[-1,-1]。
示例:
输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]
输出: [3,9]
提示:
- 0 <= len(array) <= 1000000
代码
from typing import List
class Solution:
def subSort(self, array: List[int]) -> List[int]:
l = len(array)
maxa, mina = -10**6, 10**6
m, n = -1, -1
for i in range(l):
if array[i] < maxa:
n = i
else:
maxa = array[i]
for i in range(l - 1, -1, -1):
if array[i] > mina:
m = i
else:
mina = array[i]
return [m, n]
if __name__ == '__main__':
s = Solution()
# 面试题 16.16.部分排序 - 示例1
array = [1, 2, 4, 7, 10, 11, 7, 12, 6, 7, 16, 18, 19]
res = s.subSort(array)
print(res) # 输出:[3,9]
11. 盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1]
输出:1
提示:
- n == height.length
- 2 <= n <= 105
- 0 <= height[i] <= 104
代码
from typing import List
class Solution:
def maxArea(self, height: List[int]) -> int:
l, r = 0, len(height) - 1
vol = 0
while l < r:
area = min(height[l], height[r]) * (r - l)
vol = max(vol, area)
if height[l] <= height[r]:
l += 1
else:
r -= 1
return vol
if __name__ == '__main__':
s = Solution()
# 11.盛最多水的容器 - 示例1
height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
res = s.maxArea(height)
print(res) # 输出:49
# 示例2
height = [1, 1]
res = s.maxArea(height)
print(res) # 输出:1