首页 > 其他分享 >力扣刷题笔记 167. 两数之和 II - 输入有序数组

力扣刷题笔记 167. 两数之和 II - 输入有序数组

时间:2022-12-01 21:15:30浏览次数:52  
标签:力扣 right target II numbers 数组 指针 两数 left

问题描述

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

解题思路:

双指针

由于需要寻找数组中两个元素相加之和等于target的元素下标。且数组是非递减排列的,因此可以考虑使用双指针的方式。

解法1

left指针以数组的第一个位置作为初始条件,right指针始终以left指针+1位置作为初始条件。先用left指针确定第一个元素,然后使用right指针寻找数组中是否有和left指针对应元素相加等于target值的,如果当right指针和left指针的和大于target时,则证明数组中没有与left指针对应元素相加等于target的数,因此,将left指针右移。依此循环,上述过程如图所示:

def twoSum(numbers, target):
    left = 0
    length = len(numbers)
    while left <= length - 2:
        right = left + 1
        while right < length:
            if numbers[left] + numbers[right] == target:
                return [left + 1, right + 1]
            elif numbers[left] + numbers[right] > target:
                break
            else:
                pre_right = numbers[right]
                while numbers[right] == pre_right and right < length - 1:
                    right += 1
                if right == length - 1:
                    break
        if numbers[right] + numbers[left] == target:
            return [left + 1, right + 1]
        pre_left = numbers[left]
        while numbers[left] == pre_left:
            left += 1

解法2

left指针以数组的第一个位置作为初始条件,right指针以数组最后一个位置作为初始条件,left指针代表的是最小的元素值,right指针代表的是最大的元素值。若left指针对应的元素值和right指针对应的元素值相加小于target,则证明数组中没有与left指针对应元素相加等于target值得元素,left指针向右移。反之,若和大于target,则证明数组中没有与right值相加等于target值的元素,right右移。依此循环,上述过程如图所示:

def twoSum2(numbers, target):
    left = 0
    right = len(numbers) - 1
    while left <= right:
        if numbers[left] + numbers[right] == target:
            return [left + 1, right + 1]
        elif numbers[left] + numbers[right] < target:
            left += 1
        else:
            right -= 1

可以看出,第二种方法比第一种方法的效率要高很多

直接遍历

依次遍历数组中的每个元素,判断target-元素i的值在数组中是否存在,若存在,则放回

def twoSum(numbers, target):
    for i in range(len(numbers)):
        if target-numbers[i] in numbers:
            if numbers.index(target-numbers[i]) == i:
                return [i+1,i+2]
            return [i+1,numbers.index(target-numbers[i])+1]
            break

标签:力扣,right,target,II,numbers,数组,指针,两数,left
From: https://www.cnblogs.com/cleveresthuang/p/16942657.html

相关文章

  • 力扣 leetcode 844. 比较含退格的字符串
    问题描述给定s和t两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回true。#代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。提示:1......
  • 324. Wiggle Sort II(难)
    ​​nums​​,reorderitsuchthat ​​nums[0]<nums[1]>nums[2]<nums[3]...​​.Example:(1)Given ​​nums=[1,5,1,1,6,4]​​,onepossibleanswer......
  • 力扣 leetcode 15. 三数之和
    问题描述给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你......
  • lintcode: Permutations II
    Givenalistofnumberswithduplicatenumberinit.Findalluniquepermutations.可以见我的博文​​全排列实现​​classSolution{public:/***@paramnu......
  • lintcode: Subsets II
    Givenalistofnumbersthatmayhasduplicatenumbers,returnallpossiblesubsets1.先排序;再按求Subsets一样的做法,只是添加前检查是否已经存在。耗时171mscla......
  • 「模拟」找到最近的有相同 X 或 Y 坐标的点(力扣第1779题)
    本题为12月1日力扣每日一题题目来源:力扣第1779题题目tag:模拟题面题目描述给你两个整数 x和 y ,表示你在一个笛卡尔坐标系下的 (x,y) 处。同时,在同一个坐标......
  • leetcode两数之和
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode(intx):val(x),next(NULL){}*};*/classSol......
  • 隧道调试本地IIS Express报400错误,127.0.0.1无法访问
    我们在使用​​https://natapp.cn​​​时,难免会本地进行调试代码,自己要申请一个隧道域名,比如:​​http://ls.nat600.top​​,然后在访问的时候加上端口会报错,使用localhost加......
  • .net core 的IIS设置环境变量 ASPNETCORE_ENVIRONMENT
    IIS统一设置ASPNETCORE_ENVIRONMENT的变量,不需要每个站点都在webconfig里进行配置,这样每次发布版本可能会被覆盖,比较麻烦,所以统一更是最好的选择,那具体步骤呢?步骤如下:1、打......
  • IIS put请求 报HTTP Error 405 - Method Not Allowed
    在新的服务器上部署了一个.netcore的项目,部分请求地址使用了put、delete方式,导致无法正常请求,报Error405-MethodNotAllowed。由于配置IIS时把“WebDAV发布”给勾选了......