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表来实现的。