1. 程式人生 > 實用技巧 >力扣 2020.07.30

力扣 2020.07.30

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)