力扣 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)