leetcode 11\14\15
11 盛最多水的容器
双指针,求面积,只关注两板之中短板的长度和两板之间的距离
1、向内移动短板, 短板可能变长,变短,或者不变,导致面积有可能增大
2、向内移动长板, 短板可能不变,或者变小,导致面积只可能减小
class Solution:
def maxArea(self, height: List[int]) -> int:
n = len(height)
i = 0
j = n-1
res = 0
while i<j:
if height[i]<=height[j]:
short_height = height[i]
short = i
else:
short_height = height[j]
short = j
S = short_height * (j-i)
res = max(res, S)
if short == i:
i += 1
else:
j -= 1
return res
14 最长公共前缀
巧妙使用 zip(*str)
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
# print(*strs)
res = ""
for item in zip(*strs):
# print(item)
ch = set(item)
if len(ch) == 1:
# print(item[0])
res += item[0]
else:
break
return res
15 三数之和
先排序,再使用双指针
注意不能有重复数组
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
if n<3 : return []
nums = sorted(nums)
# print(nums)
res = []
for i in range(n):
if nums[i]>0:
return res
if i>0 and nums[i] == nums[i-1]:
continue
L = i+1
R = n-1
while L < R:
temp_sum = nums[i] + nums[L] + nums[R]
if temp_sum == 0:
res.append([nums[i],nums[L], nums[R]])
while L<R and nums[L] == nums[L+1]:
L += 1
while L<R and nums[R] == nums[R-1]:
R -= 1
R -= 1
L += 1
elif temp_sum > 0:
R -= 1
else:
L += 1
return res