【算法】关于双指针的奇技淫巧(一):对撞指针

news2024/9/21 4:29:28

一、对撞指针

        对撞指针由两个指针组成,分别指向数据的头部和尾部

        两个指针分别从两头移动,寻找符合答案的位置后停下。对撞指针主要应用于有序数组的求和,我们使用一个题目进行说明:

         示例如下:

         根据题目可以得出以下条件:

  • 数组是按照有序递增的顺序排列的。
  • 不可以使用重复相同的元素(即index1=index2不合理),而是存在1<index1<index2<=numbers.Length的关系。
  • 只对应唯一的答案,也就是答案可能不止一个,只需要输出其中一个即可

        解决方案有很多,使用两个for进行遍历、二分查找、动态规划等等,我们使用示例一来讲解对撞指针:

         初始化两个头尾指针,分别指向数组的头尾部分:

         判断一下当前数值相加是否符合目标数,2 + 15 = 17 > 9 ,尾部指针向左移动

        再来判断一下:2 + 11 = 13 > 9,继续尾部指针向左移动:

        2 + 7 = 9 == 9,输出结果。看到这里,估计很多人会为什么这样就可以得出正确结果? 下面我们使用一个例子来分析说明:

         我们把所有可能的相加结果都列举出来:

         根据条件二,我们首先排除index1 = index 2的情况:

         黑色部分为淘汰部分:

        紧接着淘汰index1 > index2部分:

 

        当前头尾指针所指向的数值之和为17,使用橙色标记:

 

        2+15 = 17 < 22,说明两数之和应该还要往上增加,而此时尾指针所指向的数已经是最大了,所以需要让头指针往右移动才可以使得两数之和往上增加,继而推断出头指针所指向的“2” 与尾指针指向的“6、10、12、15”都不符合,因为“15”已经是最大都不符合目标数,其他比它小的数就更不用说,当前头指针往右移动:

         当前情况如下:

         紧接着再来推断,6 + 15 = 21 < 22,说明两数之和还不够大,继续往上增,头指针再往右移动:

        按照上面说的再次排除一项:

        10 + 15 = 25 > 22,只要看明白上面说的原理,这里理解起来也很简单,就是两数之和比目标数要大,所以要让两数之和减少,因为头指针所指向的数已经是最小的了,所以需要让尾指针往左移动来减少两数之和:

         将Y中的一项排除掉:

        最后剩下的那个数,即为正确答案,由此我们可以得出对撞指针的判断条件

  • 两数之和大于目标数,尾指针往左移动
  • 两数之和小于目标数,头指针往右移动
  • 两数之和等于目标数,输出结果

        对撞实现的代码如下(参考):

        下一章将介绍快慢指针,用于快速求取中间数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

元数据管理Datahub基本介绍和特点

目录1. 基本介绍2. 功能特色2.1 支持不同平台的元数据同步和搜索2.2 血缘关系2.3 查询数据集的统计信息2.4 实时治理2.5 Datahub的权限管理2.6 使用Domains、Glossary Terms、tags对数据Entity进行管理2.7 在Web界面对元数据进行管理1. 基本介绍 Datahub是现代数据栈的元数据管…

TypeScript(一)TypeScript下载安装,编译运行的三种方式:tsc命令行/webpack搭建环境/tsc-node库

什么是TypeScript? TypeScript是拥有类型的JavaScript超集&#xff0c;它可以编译成普通、干净、完整的JavaScript代码。 简单理解&#xff1a;TypeScript就是加强版的JavaScript TypeScript环境搭建 搭建前准备 TypeScript最终会被编译成JavaScript代码&#xff0c;那么我…

JavaSE笔记——函数式编程(类库)

文章目录前言一、基本类型二、重载解析三、FunctionalInterface四、默认方法五、Optional总结前言 前面知道了如何编写 Lambda 表达式&#xff0c;下面将详细阐述另一个重要方面&#xff1a;如何使用 Lambda 表达式。即使不需要编写像 Stream 这样重度使用函数式编程风格的类库…

find_package()的使用

find_package()命令是用来查找依赖包的&#xff0c;理想情况下&#xff0c;一句find_package()把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到&#xff0c;后续只管用就好了。但实际中往往CMake失败就是出在find_package()的失败上&#xff08;这里不考…

朝花夕拾 - 2023 莽一年

Hello 2023&#xff0c;我来了~今年&#xff0c;又是一个怎样的楚门世界&#xff0c;我要如何在里面撒泼&#xff0c;期待~一 回收 2022 不及格答卷 回首 2022&#xff0c;那真的不堪回首&#xff0c;细节太多了&#xff0c;没做好没把握住~但是&#xff0c;不管 2022 过得怎样…

Qt6 中如何使用 qsb

【写在前面】 Qt 5 的图形体系结构非常依赖 OpenGL 作为底层 3D 图形 API。但过去 8 年来随着 Metal 和 Vulkan 的推出&#xff0c;市场发生了巨大变化。现在&#xff0c;Qt 6 加入了大量不同平台的图形 API&#xff0c;以确保用户可以在所有平台上以最高性能运行 Qt。 在 Qt Q…

【类和对象(完结)】

目录 1. 再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2. static成员 2.1 概念 2.2 特性 3. 友元 3.1 友元函数 3.2 友元类 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 7. 再次理解类和对象 8.总结 1. 再谈构造函数 1.1 构造函数体…

技术分享| 如何使用Prometheus实现系统进程监控

如何监控线上正在运营的系统&#xff1f;如何得知系统目前是正常还是异常&#xff1f; Prometheus是这么一套数据监控解决方案。它能让运维及开发人员随时掌控系统的运行状态&#xff0c;快速定位出现问题的位置&#xff0c;快速排除故障。只要按照 Prometheus的方式来做&#…

力扣刷题记录——258. 各位相加、263.丑数、268.丢失的数字

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《258. 各位相加、263.丑数、268.丢失的数字》。 目录 25…

第三十五讲:神州无线局域网基础知识

1. IEEE 802.11协议 802.11无线标准家族包括802.11a/b/g/n/ac五个标准理论上可以提供高达每秒1Gbit的数据传输能力标准定义了如何使用免授权2.4 GHz 和 5GHz 频带的电磁波进行信号传输。 802.11无线标准家族 802.11a 802.11b 802.11g 802.11n 802.11ac 工作频段 5GHz 2…

内存访问为什么要分段?

内存分段是处理器为访问内存而设计的机制&#xff0c;称为内存分段机制。 简单的内存知识 内存结构&#xff08;连续且地址依次升高&#xff09; 访问方式 内存是随机读写设备&#xff0c;即访问其内部任何处&#xff0c;不需要从头开始找&#xff0c;只要直接给出其地址便可。…

【项目启动】IDEA新建项目同步到Github

文章目录SSH秘钥检查GitHub创建项目IDEA创建项目IDEA同步GitHubSSH秘钥检查 目前&#xff0c;github不支持https形式的远程同步方式&#xff0c;如果使用https形式进行同步会报以下错误&#xff1a; remote: Support for password authentication was removed on August 13, 2…

C# WinForm CAD文件显示(dxf,dwg显示)

找遍全网很难找到开源dxf显示控件(C# winform)&#xff0c;大部分控件都需要收费&#xff0c;对于做软件开发很麻烦 C# WPF倒是有nefdxfZoomableCanvas可以实现&#xff0c;确实很方便&#xff0c;这个在github&#xff1a;https://github.com/shao200/WpfDxfViewer上也能找到开…

c++11 标准模板(STL)(std::deque)(六)

定义于头文件 <deque> std::deque 容量 检查容器是否为空 std::deque<T,Allocator>::empty bool empty() const; (C11 前) bool empty() const noexcept; (C11 起) (C20 前) [[nodiscard]] bool empty() const noexcept; (C20 起)检查容器是否无元素&#xff0c…

大数据NiFi(四):NiFi单节点安装

文章目录 NiFi单节点安装 一、介绍与下载 二、单节点安装

JavaWeb:JSP概述及原理

1&#xff0c;JSP概述 JSP&#xff08;全称&#xff1a;Java Server Pages&#xff09;&#xff1a;Java服务端页面。 是一种动态的网页技术&#xff0c;其中既可以定义 HTML、JS、CSS等静态内容&#xff0c;还可以定义 Java代码的动态内容&#xff0c;也就是 JSP HTML Java…

javaee之SpringMVC2

SpringMVC返回值类型以及响应数据类型 1.搭建环境 还是按照springMVC1中的搭建环境进行搭建。这里就不多说。 响应之返回值是String类型 我们先来创建一个User类 User,java package com.pxx.domain;import java.io.Serializable;public class User implements Serializab…

PS 矩形选区工具(1)基本用法 生成图层 选区方式演示讲解

我们先打开PS 然后打开一个项目 我们可以选择一个图层 然后 点击左上角 图像>调整>色相.饱和度 弹出操作框之后 我们拉动色相的色条 对应视图就会发生主体颜色的变化 然后 我们打开一个只有一个图层的图片项目 我们对这个图层操作 整个都会变化 但如果我只是想改其中…

后悔升级iPhone?教你如何把iOS15降回iOS14

还在使用betabeta版iOS 15和iPadOS 15吗&#xff1f;如果你出于某种原因准备返回稳定的iOS 14&#xff0c;本篇文章将会为你详细介绍如何从 iOS 15 beta版降级到 iOS 14&#xff0c;这对于有一定动手能力的人来说并不难。 如何从 iOS 15 beta版降级到 iOS 14 重要提示&#xf…

Spring是怎么回事?新手入门就看这篇吧

前言 今天壹哥给大家介绍一套开源的轻量级框架&#xff0c;它就是Spring。在给大家详细讲解Spring框架之前&#xff0c;壹哥先给大家介绍Spring框架的主要内容&#xff1a; Spring的基本概念 Spring核心思想之ioc Spring核心思想之aop Spring框架对事务的支持 在本系列文章…