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)

posted on 2020-07-30 17:49  eryoung2  阅读(146)  评论(0编辑  收藏  举报