面试经典150题——两数之和 II - 输入有序数组

面试经典150题 day27

      • 题目来源
      • 我的题解
        • [方法一 哈希表](#方法一 哈希表)
        • [方法二 双指针](#方法二 双指针)
        • [方法三 双指针(二分查找优化)](#方法三 双指针(二分查找优化))

题目来源

力扣每日一题;题序:167

我的题解

方法一 哈希表

使用哈希表存储每个元素及其位置。

然后遍历过程中判断 哈希表中是否存在 target-numbers[i],若存在,则直接将 当前位置+1 和 map.get(target-numbers[i]) 返回
时间复杂度 :O(n)
空间复杂度:O(n)。哈希表需要的空间

java 复制代码
public int[] twoSum(int[] numbers, int target) {
    Map<Integer,Integer> map=new HashMap<>();
    int n=numbers.length;
    for(int i=0;i<n;i++){
        map.put(numbers[i],i+1);
    }
    for(int i=0;i<n;i++){
        if(map.containsKey(target-numbers[i])){
            return new int[]{i+1,map.get(target-numbers[i])};
        }
    }
    return new int[]{-1,-1};
}
方法二 双指针

因为数组本身升序排序,所以可以使用双指针来解决。初始时,一个指针left指向开始位置,一个指针right指向结束位置。若numbers[left]+numbers[right]=target,则直接返回[left+1,right+1];若大于则right--,因为只有right往左移才会使得和更小;若小于则left++,因为只有left往右移才会使得和更大。
时间复杂度:O(n)

空间复杂度:O(1)

java 复制代码
public int[] twoSum(int[] numbers, int target) {
    int n=numbers.length;
    if(n==2){
        return new int[]{1,2};
    }
    int left=0,right=n-1;
    while(left<right){
        int t=numbers[left]+numbers[right];
        if(t==target){
            return new int[]{left+1,right+1};
        }else if(t>target){
            right--;
        }else{
            left++;
        }
    }
    return new int[]{-1,-1};
}
方法三 双指针(二分查找优化)

因为数组本身升序排序,所以可以使用双指针来解决。初始时,一个指针left指向开始位置,一个指针right指向结束位置。

若numbers[left]+numbers[right]=target,则直接返回[left+1,right+1];

若numbers[left]+numbers[mid]=target,则直接返回[left+1,mid+1];

若numbers[left]+numbers[mid]>target则right=mid-1,因为只有mid往左移才会使得和更小;

若numbers[left]+numbers[mid]<target则left=mid+1,因为只有left往右移才会使得和更大。
时间复杂度:最好情况O(logN),最坏O(N)

空间复杂度:O(1)

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

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

相关推荐
小辉同志4 分钟前
207. 课程表
c++·算法·力扣·图论
han_hanker9 分钟前
@Validated @Valid 用法
java·spring boot
小CC吃豆子11 分钟前
详细介绍一下静态分析工具 SonarQube
java
CheerWWW12 分钟前
深入理解计算机系统——位运算、树状数组
笔记·学习·算法·计算机系统
DevOpenClub14 分钟前
全国三甲医院主体信息 API 接口
java·大数据·数据库
仟濹19 分钟前
2026-04-09~10-复习计划+蓝桥杯注意的点
职场和发展·蓝桥杯
言慢行善21 分钟前
SpringBoot中的注解介绍
java·spring boot·后端
一勺菠萝丶24 分钟前
管理后台使用手册在线预览与首次登录引导弹窗实现
java·前端·数据库
无巧不成书021836 分钟前
Java包(package)全解:从定义、使用到避坑,新手零基础入门到实战
java·开发语言·package·java包
身如柳絮随风扬1 小时前
SpringMVC 异常处理?Spring 父子容器?
java·spring·mvc