首页 > 编程语言 >两数之和 II - 输入有序数组(数据结构和算法两种实现方式)

两数之和 II - 输入有序数组(数据结构和算法两种实现方式)

时间:2023-03-02 22:55:05浏览次数:53  
标签:index1 下标 target II numbers index2 数据结构 两数 指针

题目:

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

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1index2

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

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

示例 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] 。

思路:

想法一:

通过map来进行查找,将数与9相减放入map中,若下一个数在map中有相等的数,则返回下标,否则继续与9相减,放入map中。

想法二:

双指针

初始时两个指针分别指向第一个元素位置和最后一个元素的位置。每次计算两个指针指向的两个元素之和,并和目标值比较。如果两个元素之和等于目标值,则发现了唯一解。如果两个元素之和小于目标值,则将左侧指针右移一位。如果两个元素之和大于目标值,则将右侧指针左移一位。移动指针之后,重复上述操作,直到找到答案。

使用双指针的实质是缩小查找范围。那么会不会把可能的解过滤掉?答案是不会。假设

numbers[i]+numbers[j]=target

是唯一解,其中 0≤i<j≤numbers.length−1初始时两个指针分别指向下标 0和下标 numbers.length−1,左指针指向的下标小于或等于 iii,右指针指向的下标大于或等于 j。除非初始时左指针和右指针已经位于下标 iii 和 j,否则一定是左指针先到达下标 iii 的位置或者右指针先到达下标 j 的位置。

如果左指针先到达下标 iii 的位置,此时右指针还在下标 j的右侧,sum>target,因此一定是右指针左移,左指针不可能移到 iii 的右侧。

如果右指针先到达下标 j 的位置,此时左指针还在下标 iii 的左侧,sum<target,因此一定是左指针右移,右指针不可能移到 j 的左侧。

由此可见,在整个移动过程中,左指针不可能移到 i 的右侧,右指针不可能移到 j 的左侧,因此不会把可能的解过滤掉。由于题目确保有唯一的答案,因此使用双指针一定可以找到答案。

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int low = 0, high = numbers.size() - 1;
        while (low < high) {
            int sum = numbers[low] + numbers[high];
            if (sum == target) {
                return {low + 1, high + 1};
            } else if (sum < target) {
                ++low;
            } else {
                --high;
            }
        }
        return {-1, -1};
    }
};

作者:力扣官方题解

标签:index1,下标,target,II,numbers,index2,数据结构,两数,指针
From: https://www.cnblogs.com/isku-ran/p/17173927.html

相关文章

  • 数据结构1.1
    一、简述本节介绍一下单调栈以及单调栈的一些应用。二、单调栈所谓单调栈,就是具有存储的元素呈现某种单调性的栈。比如:从栈底元素到栈顶元素是单调递减的,就是一个单调......
  • 80. 删除有序数组中的重复项 II
    给你一个有序数组nums,请你原地删除重复出现的元素,使每个元素最多出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用......
  • 82. 删除排序链表中的重复元素 II
    存在一个按升序排列的链表,给你这个链表的头节点head,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果......
  • 503. 下一个更大元素 II
    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字x的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更......
  • [oeasy]python0098_个人计算机浪潮_IBM5100_微软成立_苹果II_VisCalc
    个人计算机浪潮回忆上次内容个人电脑(PC)在爱好者之间疯传人人都有一台计算机从attair-8800到apple-1个人电脑离普通人更近了如果人人都有自己的电脑谁还去用终端连......
  • 3月1日至3月2日——数据结构与算法分析阅读笔记,线性表,AI。
    (开头是一些废话啊,最近感觉学习状态不太好,上高数的时候左耳听进去右耳就出来了,有点跟不上,可能是没吃饭的原因,也可能是最近强度有点大了,下午上完课就给自己休息了一下,结果刷......
  • 数据结构与算法之美
    复杂度分析为什么需要时间复杂度?通过统计、监控获得代码的运行时长和占用内存有一定的局限性。测试结果非常依赖测试环境。如在不同的处理器下获得的运行结果不同。......
  • 关于亚马逊SP-API接口PII申请的一些建议
    网站域名以及你提交的所有资料,不要重复,比如域名,不要你之前申请的时候填写过,被拒绝了,后来申请又填写,这就是资料重复了,资料重复了,你申请公共的亚马逊SP-API开发者PII权限是......
  • 【ZooKeeper基础-数据结构、服务端/客户端常用命令】
    一、ZooKeeper简介二、ZooKeeper数据结构&命令**1、数据结构**2、服务端常用命令①单机启动命令:./zkServer.shstart②状态查询命令:./zkServer.shstatus③停止服务......
  • 数据结构之单向不循环链表
    链表是一种物理存储结构上非连续、非顺序的线性存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表中的元素(节点)中记录了与其他元素的连接关系,链表的存储方......