Fork me on GitHub

LeetCode-双指针

LeetCode11 盛最多水的容器

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
l,r = 0,len(height)-1
res = 0
while l<r:
area = min(height[l],height[r])*(r-l)
res = max(res,area)
if height[l] < height[r]:
l += 1
else:
r -= 1
return res

LeetCode26. 删除排序数组中的重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
if n==0:
return 0
index = 0
for i in range(n):
if nums[index] != nums[i]:
index += 1
nums[index] = nums[i]
return index + 1

LeetCode80. 删除排序数组中的重复项 II

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
m = len(nums)
if m <= 2:
return m
index = 1
for i in range(2,m):
if nums[i] != nums[index-1]:
index += 1
nums[index] = nums[i]
return index+1

LeetCode75. 颜色分类

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution:
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
m = len(nums)
r,b = 0,m-1
i = 0
while i<b+1:
if nums[i] == 0:
nums[i],nums[r] = nums[r],nums[i]
i += 1
r += 1
elif nums[i] == 2:
nums[i],nums[b] = nums[b],nums[i]
b -= 1
else:
i += 1
return

LeetCode713. 乘积小于K的子数组

给定一个正整数数组 nums。
找出该数组内乘积小于 k 的连续的子数组的个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution(object):
def numSubarrayProductLessThanK(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
if k<=1: return 0
count,prod,left = 0,1,0
for i in range(len(nums)):
prod *= nums[i]
while prod>=k:
prod /= nums[left]
left += 1
count += i-left+1

return count