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

[数组双指针] 0167. 两数之和 II - 输入有序数组

文章目录

      • 1. 题目链接
      • 2. 题目大意
      • 3. 示例
      • 4. 解题思路
      • 5. 参考代码

1. 题目链接

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



2. 题目大意

描述:给定一个下标从 1 开始计数、升序排列的整数数组:numbers 和一个目标值 target。

要求:从数组中找出满足相加之和等于 target的两个数,并返回两个数在数组中下的标值。

说明

  • 2≤numbers.length≤3×104。
  • −1000≤numbers[i]≤1000。
  • numbers 按非递减顺序排列。
  • −1000≤target≤1000。
  • 仅存在一个有效答案。


3. 示例

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


4. 解题思路

  1. 思路1: 对撞指针

可以考虑使用对撞指针来减少时间复杂度。具体做法如下:

  1. 使用两个指针 left,right。left 指向数组第一个值最小的元素位置,right 指向数组值最大元素位置。
  2. 判断两个位置上的元素的和与目标值的关系。
    1. 如果元素和等于目标值,则返回两个元素位置。
    2. 如果元素和大于目标值,则让 right 左移,继续检测。
    3. 如果元素和小于目标值,则让 left 右移,继续检测。
  3. 直到 left 和 right 移动到相同位置停止检测。
  4. 如果最终仍没找到,则返回 [−1,−1]。

2 思路2: 双指针

利用 HashMap 可以通过遍历数组找到数字组合,时间和空间复杂度均为 O(N) 。

注意本题的 numbers 是 排序数组 ,因此可使用 双指针法 将空间复杂度降低至 O(1) 。

初始化: 双指针 i , j 分别指向数组 numbers 的左右两端 (俗称对撞双指针)。

循环搜索: 当双指针相遇时跳出。

计算和 s=numbers[i]+numbers[j] 。

若 s>target ,则指针 j 向左移动,即执行 j=j−1 。

若 s<target ,则指针 i 向右移动,即执行 i=i+1 。

若 s=target ,由于题目要求索引从 1 开始,因此返回数组 [i+1,j+1] 。

若循环结束,则返回空数组,代表无和为 target 的数字组合。



5. 参考代码

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int left = 0; 
        int right = numbers.length-1;

        while(left < right){
            int total = numbers[left] + numbers[right];
            if(total == target){
                return new int[]{left+1, right+1};
            }else if(total < target){
                left++;
            }else{
                right--;
            }
        }
        return new int[]{-1, -1};
    }
}

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int i = 0, j = numbers.length - 1;
        while (i < j) {
            int s = numbers[i] + numbers[j];
            if (s < target) i++;
            else if (s > target) j--;
            else return new int[] { i + 1, j + 1 };
        }
        return new int[0];
    }
}




http://www.kler.cn/a/406650.html

相关文章:

  • numpy中的nan填充
  • Linux: network: tcp: TCP: request_sock_TCP: Possible SYN flooding on port 3868.
  • YOLOV5/rknn生成可执行文件部署在RK3568上
  • 力扣刷题--21.合并两个有序链表
  • 远程管理不再难!树莓派5安装Raspberry Pi OS并实现使用VNC异地连接
  • nginx代理解决跨域问题CORS错误
  • 为什么芯麦的 GC4931P 可以替代A4931/Allegro 的深度对比介绍
  • Android开发实战班-Android App 的启动过程
  • 分布式系统稳定性建设-性能优化篇
  • 【大数据学习 | Spark-Core】yarn-client与yarn-cluster的区别
  • Oracle 19c Rac + ADG搭建(源库:RAC,目标库FS)
  • 迈向AI驱动的数据新时代:探索SQL Server 2025的全新向量数据库
  • 一文说清:C和C++混合编程
  • VTK知识学习(12)- 读取PNG图像
  • 深入探索JMeter bin目录中的Properties文件:优化性能测试的关键
  • 【功能实现】bilibili顶部鼠标跟随效果怎么实现?
  • Python +Pyqt5 简单视频爬取学习及工具实现(二)
  • 5.STM32之通信接口《精讲》之USART通信---实验串口接收程序
  • 关于汽车多核架构
  • 算法专题十一: 基础递归
  • Tomcat 任意写入文件漏洞(CVE-2017-12615)
  • docker镜像源配置、换源、dockerhub国内镜像最新可用加速源(仓库)
  • 10 分钟,教你如何用 LLama-Factory 训练和微调 LLama3 模型
  • 计算机网络(14)ip地址超详解
  • Vision-Language Models for Vision Tasks: A Survey 论文解读
  • 【代码随想录day36】【C++复健】1049. 最后一块石头的重量 II ; 494. 目标和 ;474.一和零