• leetcode做题笔记167. 两数之和 II - 输入有序数组


    给你一个下标从 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] 。

    思路一:双指针

    c++解法

    1. class Solution {
    2. public:
    3. vector<int> twoSum(vector<int>& numbers, int target) {
    4. int n = numbers.size();
    5. vector<int> res;
    6. int left = 0,right = n-1;
    7. while(left
    8. if(numbers[left]+numbers[right]>target)right--;
    9. if(numbers[left]+numbers[right]
    10. if(numbers[left]+numbers[right]==target){
    11. res.push_back(left+1);
    12. res.push_back(right+1);
    13. return res;
    14. }
    15. }
    16. return res;
    17. }
    18. };

    分析:

    本题要返回两数之和等于目标数的两个数,因为原数组已经按照非递减的顺序排列,可以利用双指针来找到两个数,当左指针和右指针两个数大于目标数则右指针向左移,反之则左指针向右移直到找到符合的两个数返回,时间复杂度为O(n)

    总结:

    本题考察双指针的应用,利用两边之和是否大于目标数来进行查找,满足题目要求的常数级额外空间的要求

  • 相关阅读:
    ps怎么对字体进行加粗?
    RK3399系统移植 | 基于 ubuntu core 20.04 构建根文件系统
    启动 Tomcat 日志乱码问题
    【Rust日报】2022-11-28 使用 Rust 编写解释型语言
    ocr的场景应用--发票识别
    【日志系统最全】Spring Cloud Sleuth使用ELK收集&amp;分析日志
    mongodb备份还原指南
    机器学习——聚类算法
    电化学传感器使用-电子学角度分析
    vscode+makefile开发STM32(二)---下载
  • 原文地址:https://blog.csdn.net/si_mple_/article/details/133716411