当前位置: 首页 > news >正文

蓝桥杯最后十天冲刺 day 2 双指针的思想

双指针思想介绍

双指针(Two Pointers)是一种在数组或链表等线性结构中常用的算法技巧,通过使用两个指针(索引或引用)以不同的速度或方向遍历数据结构,从而高效解决问题。双指针通常用于优化暴力解法,将时间复杂度从 O(n²) 降低到 O(n) 或 O(n log n)。

常见应用场景:
  1. 快慢指针:用于链表中的环检测、找中点等(如快指针每次走两步,慢指针走一步)。
  2. 左右指针:用于有序数组的两数之和、反转数组等(如一个指针从左向右,另一个从右向左)。
  3. 滑动窗口:通过调整两个指针的间隔解决子数组/子串问题(如最小覆盖子串)。

蓝桥杯中的双指针题目示例

以下是蓝桥杯竞赛中可能用到双指针思想的题目及其解法思路:

1. ​两数之和(有序数组)​
  • 题目描述:给定一个升序排列的数组和一个目标值,找到数组中两个数的和等于目标值,返回它们的索引。
  • 双指针解法
    • 初始化左指针 left = 0,右指针 right = len(nums) - 1
    • 比较 nums[left] + nums[right] 与目标值:
      • 若和等于目标值,返回结果;
      • 若和小于目标值,left++(需要更大的数);
      • 若和大于目标值,right--(需要更小的数)。
  • 时间复杂度:O(n)。
def twoSum(nums, target):
    left, right = 0, len(nums) - 1
    while left < right:
        s = nums[left] + nums[right]
        if s == target:
            return [left, right]
        elif s < target:
            left += 1
        else:
            right -= 1
    return []
2. ​三数之和(去重)​
  • 题目描述:找到数组中所有不重复的三元组,满足 a + b + c = 0
  • 双指针解法
    • 先排序数组,固定一个数 nums[i],然后用双指针在 i+1 到末尾寻找两数之和等于 -nums[i]
    • 需跳过重复值以避免重复解。
  • 时间复杂度:O(n²)。
 

python

复制

def threeSum(nums):
    nums.sort()
    res = []
    for i in range(len(nums) - 2):
        if i > 0 and nums[i] == nums[i - 1]:
            continue  # 去重
        left, right = i + 1, len(nums) - 1
        while left < right:
            s = nums[i] + nums[left] + nums[right]
            if s < 0:
                left += 1
            elif s > 0:
                right -= 1
            else:
                res.append([nums[i], nums[left], nums[right]])
                while left < right and nums[left] == nums[left + 1]:
                    left += 1  # 去重
                while left < right and nums[right] == nums[right - 1]:
                    right -= 1  # 去重
                left += 1
                right -= 1
    return res
3. ​盛最多水的容器(贪心+双指针)​
  • 题目描述:给定一个数组表示容器的高度,找到两条线使得它们与 x 轴构成的容器能装最多的水。
  • 双指针解法
    • 初始化 left = 0right = len(height) - 1max_area = 0
    • 每次移动较短的边(因为移动长边不可能增加面积)。
  • 时间复杂度:O(n)。
 

python

复制

def maxArea(height):
    left, right = 0, len(height) - 1
    max_area = 0
    while left < right:
        area = (right - left) * min(height[left], height[right])
        max_area = max(max_area, area)
        if height[left] < height[right]:
            left += 1
        else:
            right -= 1
    return max_area
4. ​蓝桥杯真题示例:日志统计(滑动窗口)​
  • 题目链接:蓝桥杯 2018 省赛
  • 问题描述:给定 N 条日志的点赞时间,统计在任意长度为 D 的时间段内点赞不少于 K 次的帖子。
  • 双指针解法
    • 按时间排序后,用滑动窗口(双指针)统计窗口内的点赞数,若满足条件则标记帖子。
  • 代码片段
     

    python

    复制

    logs = [...]  # 日志数据格式: [(时间, 帖子id), ...]
    logs.sort()
    count = {}  # 记录当前窗口内各id的点赞数
    res = set()
    left = 0
    for right in range(len(logs)):
        id = logs[right][1]
        count[id] = count.get(id, 0) + 1
        while logs[right][0] - logs[left][0] >= D:
            count[logs[left][1]] -= 1
            left += 1
        if count[id] >= K:
            res.add(id)

总结

双指针的核心是通过协同移动两个指针减少不必要的计算,常用于:

  • 有序数组的搜索(如两数之和)。
  • 滑动窗口问题(如子串、区间统计)。
  • 链表操作(如快慢指针)。

在蓝桥杯竞赛中,双指针常与排序、贪心等结合,需注意边界条件和去重处理。

http://www.dtcms.com/a/108516.html

相关文章:

  • TortoiseSVN设置忽略清单
  • 新零售系统是什么样的?有什么好处?
  • Links for llama-cpp-python whl安装包下载地址
  • WEB安全--SQL注入--上传webshell的其他方式
  • QT_xcb 问题
  • java问题
  • 《Viewport:解析与优化,提升网页体验的关键要素》
  • ETLCloud是如何通过Oracle实现CDC的?
  • Elasticsearch 报错index_closed_exception
  • JavaScript Array(数组)
  • LVGL实现一个简易画图板
  • OSPF的Broadcast网络类型
  • [论文笔记] Deepseek技术报告解读: MLAMTP
  • Ubuntu与本地用户交流是两种小方法
  • 一个c#的简单日志记录类,避免使用Nuget依赖
  • Zabbix_agent自动注册教程!
  • 利用 PHP 爬虫按关键字搜索淘宝商品
  • uni-app 微信小程序 WebSocket 接入讯飞语音合成(流式版)WebAPI 示例
  • 【Redis】如何处理缓存穿透、击穿、雪崩
  • 在 Blazor 中使用 Chart.js 快速创建数据可视化图表
  • 大模型生成浏览器端的初级俄罗斯方块
  • 美团民宿 mtgsig 小程序 mtgsig1.2 分析
  • Unity中的C#脚本中文字符无法正常显示问题
  • mysql-创建和删除索引的两种方式
  • 针对 MySQL 数据库中 主键/唯一约束的更新方法 和 ON DUPLICATE KEY UPDATE 语法的详细说明及示例,并以表格总结
  • YOLOv11区域检测
  • Element Plus 常用组件
  • 超越人工智能驱动的网络攻击:现代防御者的策略
  • 电子电气架构 --- 智能座舱域控设计
  • Flutter 音视频播放器与弹幕系统开发实践