11. 乘最多水的容器
题目
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
思路
我们可以遍历数组,分别求出各个横纵轴的面积,然后取最大面积进行返回。
代码
class Solution:
def maxArea(self, height: List[int]) -> int:
max_area = 0 #最大面积
left = 0 #左侧下标
right = len(height) - 1 #右侧下标
while left < right:
#比较上一次的最大面积和新的最大面积
max_area = max(max_area, min(height[left], height[right]) * right - left)
#按照长边为标准进行循环
if height[right] > height[left]:
left += 1
else:
right -= 1
return max_area
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)
343. 整数拆分
题目
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
思路
其实这是个纯数学问题,网上很多大虾也给出了好的解决办法,那就是一直择3出来做乘数,知道择不下去为止。
也就是,3 * 3 * 3 * ... 这样子,就可以保证积最大。
那么根据这个思路,当给定的整数小于3时,我们可以手动算出它的最大乘积。
n=2时,最大乘积为1;n=3时,最大乘积为2.
综上所述,可以看一下代码。
代码
class Solution:
def integerBreak(self, n: int) -> int:
# 给定的数字n小于3时,手动算出结果
if n == 2:
return 1
if n == 3:
return 2
a = 1
# 给定的数字大于3时,将全部的3择出来后,进行最后乘积的计算
while (n > 4):
n = n - 3
a = a * 3
# 返回最后的结果
return a * n
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)
About me: 资深大猪蹄子