总结和巩固一下双指针法,滑动窗口法也可以看成是双指针法。
对于第一题,我尝试之后的题解如下,第一种解法是两次循环,时间复杂度为O(n^2),而我们注意到,因为该题目是有序数组,所以可以考虑利用单调性 进行优化,我们注意到,可以将此题看成反向移动的双指针题,如果在某个时候,左右两个数的和大于等于target,那么满足题意的有可能的情况 就是要么增加左端的数,要么减小右端的数。并且由于这个题只存在一个解,最坏的情况既是两端指针相遇,故时间复杂度为O(n). twoSum2应该 是比较好的。
class Solution:
def twoSum1(self, numbers, target):
for i in range(len(numbers)):
for j in range(i+1, len(numbers)):
if numbers[i] + numbers[j] == target:
return [i + 1, j + 1]
def twoSum2(self, numbers, target):
i, j = 0, len(numbers)-1
while i < j:
if numbers[i] + numbers[j] > target:
j -= 1
elif numbers[i] + numbers[j] < target:
i += 1
else:
return [i + 1, j + 1]
def twoSum3(self, numbers, target):
i, j = 0, len(numbers) - 1
for i in range(len(numbers)):
while j - 1 > i and numbers[j - 1] + numbers[i] >= target:
j -= 1
if numbers[i] + numbers[j] == target:
return [i + 1, j + 1]
PREVIOUSlc509.斐波那契数