蓝桥杯必看代码(二)--双指针算法

双指针算法

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)

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值