LeetCode
11.盛最多水的容器
給定 n 個非負整數 a1,a2,…,an,每個數代表座標中的一個點 (i, ai) 。畫 n 條垂直線,使得垂直線 i 的兩個端點分別爲 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
注意:你不能傾斜容器,n 至少是2。
Solution:
class Solution:
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
maxSpace = 0
i = 0
j = len(height) - 1
while(i <= j):
length = j - i
if (height[i] < height[j]):
h = height[i]
i += 1
else:
h = height[j]
j -= 1
maxSpace = maxSpace if maxSpace > h * length else h * length
return maxSpace
思路:因爲面積是取決於較小高度的端點,所以我們從兩端開始取高度,每一次都使用較小的高度乘以距離算一次面積,和之前的最大面積比較並保存最大面積,然後較小的端點就往中間移動直到兩個端點重合。
62.不同路徑
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲“Finish”)。
問總共有多少條不同的路徑?
說明:m 和 n 的值均不超過 100。
示例 1:
輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右
示例 2:
輸入: m = 7, n = 3
輸出: 28
Solution:
class Solution:
def factorial(self, num):
if (num == 1 or num == 0):
return 1
else:
return num * self.factorial(num-1)
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
x = min(m, n) - 1
y = m + n - 2
return int(self.factorial(y) / (self.factorial(x) * self.factorial(y - x)))
思路:利用遞歸計算階乘,然後使用組合數解決問題。可以使用數組保存階乘結果來優化,本題數據較小,可以不用。
217.存在重複
給定一個整數數組,判斷是否存在重複元素。
如果任何值在數組中出現至少兩次,函數應該返回 true。如果每個元素都不相同,則返回 false。
Solution:
class Solution:
def containsDuplicate(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
if(len(nums) > 0):
if (len(nums) != len(set(nums))):
return True
else:
return False
return False
思路:使用set函數將列表中的重複元素刪除,然後比較前後的列表長度是否相同。
我一開始使用python寫了hash表來判斷重複元素,提交後雖然通過了,但是用的時間太長了,後來看了別人的代碼,發現set可以解決這類問題,而python中set的實現其實就是通過hash表來實現的。