leetCode 167.两数之和 || - 输入有序数组 双指针解法

news2024/10/7 0:50:54

167. 两数之和 II - 输入有序数组 - 力扣(LeetCode)

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1  index2。你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

示例 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。

示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

>>思路和分析:(举个栗子)

① 暴力破解

双指针解法本文着重讲此方法

这里的2+8=10>9,且由于是有序数组,势必在范围(left,right)中的任意一数与right所指之数之和一定大于9。此时需要让right--,才有可能找到题目所求

这里的2+6=8<9,且由于是有序数组,势必在范围(left,right)中的任意一数与left所指之数之和一定小于9。此时需要让left++,才有可能找到题目所求

这里的3+6=9,可获得题目所求

  • 思考:🤔与暴力破解方法相比,用双指针有什么好处?

注意每次只花费O(1)的时间,把两个数加起来和 target=9 比较大小。我们就通过这个大小关系直接去掉了一个数。每次花费O(1)时间去掉一个数,直到找到答案。因此,这个算法的时间复杂度是O(n)。这相比原来的暴力做法O(n)就是一个巨大的优化。

  • 分析:🤔那么这个算法相比暴力解法到底快哪里?

用一个获取多少信息量来衡量一个算法的效率,暴力做法就是找两个数加起来和9比一比。那它花费O(1)的时间就知道了O(1)的信息,而优化之后的做法,是把当前剩下的最小的数和最大的数加起来和9比一比,那比完之后,就知道其中一个数和其他任何一个数相加都是小于9的,或者都是大于9的。那这样我就花费O(1)的时间,就知道了O(n)的信息。那这就是为什么能够从O(n^2)优化到O(n)。

  • 思考:🤔这个解法的本质是什么?
    • 其实是缩减搜索空间

注意这一切的前提是数组是排好序的,我们利用了这个性质,如果数组是没有序的,那么我们就不能够使用这个算法,那如何用代码实现呢?可以初始化两个下标,也可以叫指针,用left 和 right,代码如下:

C++代码:

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int left=0,right = numbers.size()-1;
        while(left<right) {
            int sum = numbers[left] + numbers[right];
            if(sum == target) return {left+1,right+1};
            // else if(sum > target) right--; 
            // else left++;
            sum > target ? --right : ++left; 
        } 
        return {};
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1) 

python代码:

class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        # 时间复杂度 O(n)
        # 空间复杂度 O(1)
        left = 0
        right = len(numbers) - 1
        while True: # left < right
            s = numbers[left] + numbers[right]
            if s == target:
                break
            if s > target:
                right-=1
            else:
                left+=1
        return [left+1,right+1]

参考和推荐文章、视频:

167. 两数之和 II - 输入有序数组 - 力扣(LeetCode)

两数之和 三数之和【基础算法精讲 01】_哔哩哔哩_bilibili

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

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

相关文章

无人化微波产品智能测试系统

无人化微波产品智能测试系统是面向射频微波产品领域客户数字化转型需求&#xff0c;推出的一款新形态自动测试系统。该系统实现了微波产品测试由单工位串行测试向多工位并行测试转变&#xff0c;具有测试容量大、测试效能高、测试管理信息化等特点。该系统可数倍提升客户的测试…

C# redis通过stream实现消息队列以及ack机制

redis实现 查看redis版本 redis需要>5.0 Stream 是 Redis 5.0 引入的一种专门为消息队列设计的数据类型&#xff0c;Stream 是一个包含 0 个或者多个元素的有序队列&#xff0c;这些元素根据 ID 的大小进行有序排列。 它实现了大部分消息队列的功能&#xff1a; 消息 ID…

Vue路由进阶--VueRouter声明式导航

Vue路由进阶–VueRouter声明式导航 文章目录 Vue路由进阶--VueRouter声明式导航1、声明式导航1.1、导航链接1.2、高亮类名1.3、跳转传参1.4、动态路由参数可选符 1、声明式导航 1.1、导航链接 需求&#xff1a;实现导航高亮效果 vue-router提供了一个全局组件router-link(取…

【数据库——MySQL(实战项目1)】(1)图书借阅系统

目录 1. 简述2. 功能3. 数据库结构设计3.1 绘制 E-R 图3.2 创建数据库3.3 创建表3.4 插入表数据 1. 简述 经过前期的学习&#xff0c;我们已经掌握数据库基础操作&#xff0c;因此是时候来做一个实战项目了——图书借阅系统。对于图书借阅系统&#xff0c;相信大家不难想到至少…

Git Stash:临时保存和切换工作状态的利器

Git是我们日常工作中不可或缺的版本控制系统。它提供了许多强大的功能&#xff0c;其中之一是Git Stash&#xff08;暂存&#xff09;。Git Stash可以帮助我们在切换分支或保存未完成的工作时&#xff0c;临时保存当前的修改&#xff0c;以便稍后重新应用。本文将介绍Git Stash…

零信任沙盒,加密沙盒,防泄密沙盒

场景描述 随着云计算、移动互联、物联网等新技术的发展&#xff0c;传统的安全边界变得越来越模糊&#xff0c;访问控制模式局限性也越来越明显。企业需满足员工在任意时间、地点对企业内部进行访问的需求&#xff1b;服务器之间各自为界、相互独立&#xff0c;缺乏统一的安全…

Docker-consul容器服务更新与发现

目录 一、consul简介 1、什么是服务注册与发现 2、什么是consul 3、consul的关键特性 二、consul部署 1、consul服务器部署 1.1 建立consul服务 2、查看集群信息 3、通过http api 获取集群信息 三、registrator部署 1、安装Gliderlabs/Registrator 2、测试服务发现…

QT项目打包脚本

QT项目打包脚本 项目修改频繁&#xff0c;肯定不能手动在开始&#xff0c;菜单&#xff0c;找到相关环境&#xff0c;再输入windeployqt 打包。这里提供一个脚本用于打包。 按Wins&#xff0c;输入CMD D:# 创建打包用的目录 md MyProjectcd D:\MyProject# 拷贝文件 copy D:…

Redis(四)多级缓存

文章目录 一、传统缓存存在的问题二、多级缓存方案三、JVM进程缓存案例演示&#xff1a; 四、Lua语法入门Lua语言入门 五、多级缓存&#xff08;一&#xff09;安装OpenResty&#xff08;二&#xff09;OpenResty入门&#xff08;三&#xff09;请求参数处理&#xff08;四&…

2023年中国塑形内衣市场发展概况分析:五年增长率高达56%,经济与安全兼具的塑身内衣市场不容小觑[图]

塑身内衣可以重修、重塑身体曲线。塑身内衣&#xff0c;能够马上雕塑您的身材&#xff0c;美好身段表露无遗&#xff0c;塑身内衣在呵护您的身体之下&#xff0c;恰到好处的集中胸部&#xff0c;雕塑腰部&#xff0c;以及提臀作用&#xff0c;缔造自然的性感窈窕美态。 塑身内…

4D5D影院设备发展前景7D互动影院体验馆应用

5D影院设备发展前景广阔。随着科技的不断进步&#xff0c;5D影院设备在电影行业中的应用越来越广泛。5D影院设备以其独特的沉浸式体验和互动性&#xff0c;吸引了大量观众。未来&#xff0c;随着技术的不断创新和成本的降低&#xff0c;5D影院设备将会得到更多的应用和推广。 首…

9月《中国数据库行业分析报告》已发布,47页干货带你详览 MySQL 崛起之路!

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…

算法题:摆动序列(贪心算法解决序列问题)

这道题是一道贪心算法题&#xff0c;如果前两个数是递增&#xff0c;则后面要递减&#xff0c;如果不符合则往后遍历&#xff0c;直到找到符合的。&#xff08;完整题目附在了最后&#xff09; 代码如下&#xff1a; class Solution(object):def wiggleMaxLength(self, nums):…

获得京东商品描述 API (商品详情图)

电商卖货&#xff0c;所有产品信息都是通过商品的主图、详情图、商品描述展示出来的。做一个简洁大方又能把产品特点介绍清楚的商品详情信息非常重要。在现有的淘宝京东拼多多等平台&#xff0c;有大量的商品数据&#xff0c;基本你做什么产品都能找到同类的产品信息。如果能够…

Spring5应用之整合MyBatis

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言为什…

腾讯云2023年双十一优惠活动整理汇总

随着双十一的到来&#xff0c;各大云服务厂商也开始纷纷推出优惠活动&#xff0c;其中腾讯云作为国内知名的云服务提供商&#xff0c;自然也不例外。那么&#xff0c;腾讯云双十一优惠活动都有哪些呢&#xff1f;本文将会为大家整理汇总&#xff0c;方便大家了解和选择。 一、腾…

Java拆装箱

拆装箱 基本数据类型和包装类的区别 包装类是对象&#xff0c;基本数据类型不是。包装类型是引用的传递&#xff0c;基本数据类型是值的传递声明方式不同&#xff1a;包装类通过new关键字&#xff0c;基本数据类型不需要通过new存储位置不同&#xff1a;包装类型存储在堆内存…

Flutter 打包 windows桌面端可执行文件

简单一说 因为个人兴趣爱好&#xff0c;在写一个跨平台工具。为了省事没去官网看文档&#xff0c;直接翻阅各大博客网站&#xff0c;一个简单的命令&#xff0c;博客写的内容比较复杂。为了方便自己和有需要同学&#xff0c;简单做一个记录。 Flutter提供了一种方便命令行的方…

将网站域名访问从http升级到https(腾讯云/阿里云)

文章目录 1.前提说明2.服务器安装 docker 与 nginx2.1 安装 docker&#x1f340; 基于 centos 的安装&#x1f340; 基于ubuntu 2.2 配置阿里云国内加速器&#x1f340; 找到相应页面&#x1f340; 创建 docker 目录&#x1f340; 创建 daemon.json 文件&#x1f340; 重新加载…

安全与隐私:直播购物App开发中的重要考虑因素

随着直播购物App的崭露头角&#xff0c;开发者需要特别关注安全性和隐私问题。本文将介绍在直播购物App开发中的一些重要安全和隐私考虑因素&#xff0c;并提供相关的代码示例。 1. 数据加密 在直播购物App中&#xff0c;用户的个人信息和支付信息是极为敏感的数据。为了保护…