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

双指针的用法以及示例

当然可以!双指针(Two Pointers)是一种常用的算法技巧,特别适用于处理数组或链表等线性数据结构的问题。以下是双指针用法的总结:

双指针用法总结

  1. 基本概念

    • 双指针技术使用两个指针在数据结构上进行遍历,通常用于解决与子数组、子序列、区间等相关的问题。
  2. 常见类型

    • 滑动窗口:用于查找满足特定条件的子数组或子串,通常涉及到动态调整两个指针的位置。
    • 对撞指针:用于从两端向中间逼近,常用于排序数组的查找、配对等问题。
  3. 滑动窗口的步骤

    • 初始化:设置两个指针(通常是 leftright)和一个窗口的状态(如和、长度等)。
    • 扩展窗口:移动 right 指针,增加窗口的大小,更新窗口状态。
    • 收缩窗口:当窗口状态不满足条件时,移动 left 指针,减小窗口的大小,直到满足条件。
    • 记录结果:在每次满足条件时,记录当前窗口的状态(如长度、下标等)。
  4. 对撞指针的步骤

    • 初始化:设置两个指针,通常一个指向数组的开始,另一个指向数组的结束。
    • 比较和移动:根据条件比较两个指针指向的元素,决定移动哪个指针,直到两个指针相遇。
  5. 应用场景

    • 查找和不超过某个值的最大子数组。
    • 查找两个数的和等于目标值。
    • 反转字符串或数组。
    • 处理有序数组的合并、去重等问题。

示例代码

假如说给你一个数组[8, 4, 6, 3, 1, 6, 7],找出不大于10的连续子数组的最大长度

def max_subarray_length(nums, threshold):  
    l = 0  
    window_sum = 0  
    max_length = 0  

    for r in range(len(nums)):  
        window_sum += nums[r]  

        while window_sum > threshold and l <= r:  
            window_sum -= nums[l]  
            l += 1  

        # 更新最大长度  
        if window_sum <= threshold:  
            max_length = max(max_length, r - l + 1)  

    return max_length  

# 示例数组  
nums = [8, 4, 6, 3, 1, 6, 7]  
threshold = 10  
result = max_subarray_length(nums, threshold)  
print("Maximum length of subarray with sum not greater than 10:", result)

在这里插入图片描述
假如说给你一个数组[8, 4, 6, 3, 1, 6, 7],找出不大于10的连续子数组

def find_subarrays(nums, threshold):  
    l = 0  
    window_sum = 0  
    valid_subarrays = []  

    for r in range(len(nums)):  
        window_sum += nums[r]  

        while window_sum > threshold and l <= r:  
            window_sum -= nums[l]  
            l += 1  

        # 在此记录所有满足条件的子数组  
        for i in range(l, r + 1):  
            valid_subarrays.append(nums[i:r + 1])  

    return valid_subarrays  

# 示例数组  
nums = [8, 4, 6, 3, 1, 6, 7]  
threshold = 10  
result = find_subarrays(nums, threshold)  
print("Continuous subarrays with sum not greater than 10:")  
for subarray in result:  
    print(subarray)

在这里插入图片描述
假如说给你一个数组[8, 4, 6, 3, 1, 6, 7],找出不大于10的最大连续子数组以及最大长度

def max_subarray_length_and_all_indices(nums, threshold):  
    l = 0  
    window_sum = 0  
    max_length = 0  
    valid_subarrays = []  

    for r in range(len(nums)):  
        window_sum += nums[r]  

        while window_sum > threshold and l <= r:  
            window_sum -= nums[l]  
            l += 1  

        current_length = r - l + 1  
        if window_sum <= threshold:  
            if current_length > max_length:  
                max_length = current_length  
                valid_subarrays = [(l, r)]  
            elif current_length == max_length:  
                valid_subarrays.append((l, r))  

    return max_length, valid_subarrays  

# 示例数组  
nums = [8, 4, 6, 3, 1, 6, 7]  
threshold = 10  
result_length, result_indices = max_subarray_length_and_all_indices(nums, threshold)  
print("Maximum length of subarray with sum not greater than 10:", result_length)  
print("Indices of all maximum subarrays:", result_indices)

在这里插入图片描述


http://www.kler.cn/news/305388.html

相关文章:

  • Python基础语法(3)上
  • 深入解析 SQLSugar:从基础 CRUD 到读写分离与高级特性详解
  • 基于YOLOv10的光伏板缺陷检测系统
  • 【drools】文档翻译1:入门
  • clip论文阅读(Learning Transferable Visual Models From Natural Language Supervision)
  • Spring Boot母婴商城:打造一站式购物体验
  • 数组及使用方法
  • 【Linux】进程调度与切换
  • 【时时三省】tessy 自动化执行用例:Command line interface(命令行接口)
  • 企业的终端安全该怎么防护?
  • OrionX vGPU 研发测试场景下最佳实践之Jupyter模式
  • Python编码系列—Python抽象工厂模式:构建复杂对象家族的蓝图
  • 数据挖掘顶会ICDM 2024论文分享┆MetaSTC:一种基于聚类和元学习的时空预测框架
  • 使用gitee如何回滚上一个版本,简单操作方式-gitee自带功能无需使用代码
  • 每天一道面试题(4):Spring Boot 的“约定优于配置”理解
  • 小程序面试题五
  • 数据结构(7.2_3)——分块查找
  • Golang | Leetcode Golang题解之第406题根据身高重建队列
  • 嵌入式 单片机面试 通信协议常见问题答案 串口通信 IIC通信 SPI通信 协议解析讲解 RS232 RS485 协议 IIC总线
  • Anolis OS 8.8 CentOS8离线安装mysql-8.0.9
  • Mac清理其他文件:释放存储空间的高效指南
  • pandas DataFrame日期字段数据处理
  • 基于 PyTorch 和 TensorFlow 的口罩检测与人脸识别系统
  • 【go】pprof 性能分析
  • 掌握 Spring:从新手到高手的常见问题汇总
  • SpringCloud Alibaba 工程搭建详细教程
  • 如何从github上clone项目
  • 事件和委托,Lambda表达式
  • python之pyecharts制作可视化数据大屏
  • Git 回滚详解:应对各种场景的策略