双指针算法
1、左右指针
左右指针分别指向数组或链表的不同位置,根据题目问题要求进行索引。
以此类推,直到找到符合题目要求的索引。
适用场景:寻找两个数特定的解,回文数的判定。
代码部分:
def two_sum(arr, target_sum):
left = 0
right = len(arr) - 1
while left < right:
if arr[left] + arr[right] > target_sum:
right -= 1
elif arr[left] + arr[right] < target_sum:
left += 1
else:
return [left, right]
else:
return False
print(two_sum([1,3,6,7,9,10,14,15], 13))
例题:
n = input()
left = 0
right = len(n) - 1
flag = ""
while left < right:
if n[left] == n[right]:
left += 1
right -= 1
flag = "YES"
else:
flag = "NO"
break
print(flag)
其实python中有列表逆序操作,我们可以直接判断字符串的顺序和逆序是否相等来直接判断是否回文。
n = input()
if n[::-1] == n:
print("YES")
else:
print("NO")
这样一看是不是简单多了?那么我们进入下一个问题:
2、快慢指针
左右指针分别指向数组或链表的相同位置,并根据问题要求移动指针。
适用场景:删除重复元素、字串、区间
代码部分:
def longth_str(s):
unique_str = set()
result = 0
left = 0
for right in range(len(s)):
while s[right] in unique_str:
unique_str.remove(s[left])
left += 1
else:
unique_str.add(s[right])
result = max(result, right - left + 1)
return result
s = "abcabcbb"
print(longth_str(s))
例题:
问题描述:有n个数和一个整数m。现要从这n个数选出一个子串,要求这个子串里面至少有k个数要大于等于m,问一共能选出多少字串。
n, m, k = map(int, input().split())
lst = [int(i) for i in input().split()]
result = 0
for left in range(0, n-k+1):
count = 0
for right in range(left, n):
if lst[right] >= m:
count += 1
if count >= k:
result = result + n - right
break
print(result)