167. 两数之和 II - 输入有序数组(中等)

167. 两数之和 II - 输入有序数组

1. 题目描述

题目中转:167. 两数之和 II - 输入有序数组

2.详细题解

作为双指针方法的第一弹,先简要介绍下该方法:

  • 若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的区域即为当前的窗口),经常用于区间搜索。
  • 若两个指针指向同一数组,但是遍历方向相反,则可以用来进行搜索,待搜索的数组往往是排好序的。
       本题同力扣 1.两数之和类似,唯一区别是该题的整数数组是有序的,先直接上暴力破解方法,双重循环遍历,可以看到,Python直接超时在第19个测试用例即失败,Java虽然测试用例通过,但报错耗时太长.
python 复制代码
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        for left in range(len(numbers)):
            for right in range(left+1,len(numbers)):
                if numbers[left] + numbers[right] == target:
                    return [left+1, right+1]
java 复制代码
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        for (int i=0;i<numbers.length;i++){
            for (int j=i+1;j<numbers.length;j++){
                if (numbers[i] + numbers[j] == target){
                    return new int[]{i+1, j+1};
                }
            }
        }
        return new int[0];
    }
}

既然该题和 1.两数之和虽然类似,但增加了有序:寻找两个数时,固定第一个数,因此有序,因此第二个数可以直接使用二分查找算法,不用再逐一遍历。进一步的,因为有序,第一个数也可以不用固定,可以使用双指针,两个指针遍历方向相反进而实现搜索,具体描述如下:

一个左指针(left)指向最小的元素,向右遍历;一个右指针(right)指向最大的元素,向左遍历;

如果两个指针指向的元素之和大于目标值,那么将右指针左移动一位,使当前和变小一点;

如果两个指针指向的元素之和小于目标值,那么将左指针右移动一位,使当前和变大一点;

如果两个指针指向的元素之和等于目标值,那么它们就是我们想要的结果;

但需要注意的是,该题的索引是从1开始而不是0开始,因此索引值需要各加1。

3.代码实现

3.1 Python

python 复制代码
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        left = 0
        right = len(numbers) - 1
        while left < right:
            if numbers[left] + numbers[right] > target:
                right -= 1
            elif numbers[left] + numbers[right] < target:
                left += 1
            else:
                break
        return [left+1, right+1]

3.2 Java

java 复制代码
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int left = 0;
        int right = numbers.length - 1;
        while (left < right){
            if (numbers[left] + numbers[right] > target){
                right--;
            }else if (numbers[left] + numbers[right] < target){
                left++;
            }else{
                break;
            }
        }
        return new int[]{left+1, right+1};
    }
}

执行用时不必过于纠结,对比可以发现,对于python和java完全相同的编写,java的时间一般是优于python的;至于编写的代码的执行用时击败多少对手,执行用时和网络环境、当前提交代码人数等均有关系,可以尝试完全相同的代码多次执行用时也不是完全相同,只要确保自己代码的算法时间复杂度满足相应要求即可,也可以通过点击分布图查看其它coder的code

相关推荐
虾饺爱下棋2 分钟前
FCN语义分割算法原理与实战
人工智能·python·神经网络·算法
千册1 小时前
python+pyside6+sqlite 数据库测试
数据库·python·sqlite
fouryears_234171 小时前
适配器模式——以springboot为例
java·spring boot·适配器模式
汽车功能安全啊2 小时前
利用对称算法及非对称算法实现安全启动
java·开发语言·安全
paopaokaka_luck2 小时前
基于Spring Boot+Vue的吉他社团系统设计和实现(协同过滤算法)
java·vue.js·spring boot·后端·spring
Eloudy3 小时前
简明量子态密度矩阵理论知识点总结
算法·量子力学
点云SLAM3 小时前
Eigen 中矩阵的拼接(Concatenation)与 分块(Block Access)操作使用详解和示例演示
人工智能·线性代数·算法·矩阵·eigen数学工具库·矩阵分块操作·矩阵拼接操作
悠哉悠哉愿意4 小时前
【电赛学习笔记】MaixCAM 的OCR图片文字识别
笔记·python·嵌入式硬件·学习·视觉检测·ocr
nbsaas-boot4 小时前
SQL Server 窗口函数全指南(函数用法与场景)
开发语言·数据库·python·sql·sql server
Catching Star4 小时前
【代码问题】【包安装】MMCV
python