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

面试经典150题 day27

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

题目来源

力扣每日一题;题序:167

我的题解

方法一 哈希表

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

然后遍历过程中判断 哈希表中是否存在 target-numbersi,若存在,则直接将 当前位置+1 和 map.get(target-numbersi) 返回
时间复杂度 :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指向结束位置。若numbersleft+numbersright=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指向结束位置。

若numbersleft+numbersright=target,则直接返回left+1,right+1;

若numbersleft+numbersmid=target,则直接返回left+1,mid+1;

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

若numbersleft+numbersmid<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};
}

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

相关推荐
纪念 2299 分钟前
C++算法(六)
开发语言·c++·算法
香蕉大香蕉(06敬畏市场)24 分钟前
MySQL 单点详解(01)
java·数据库·mysql·面试·博客·实习
ShineWinsu38 分钟前
对于Qt:QCheckBox常见属性的详细解析
c++·qt·面试·笔试·gui·qcheckbox·多选框
LaughingZhu39 分钟前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion
师夷长技以自愈1 小时前
第 3 讲:多 Agent——Supervisor 分诊 + 专职 Worker
面试
niucloud-admin1 小时前
NIUCLOUD PHP SAAS上门家政使用文档:服务保障
java·开发语言·php
Dumbness1 小时前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法
taka1 小时前
从 24x 到 141x:我用纯 Python 零依赖项目,扒开了 GPU 加速的性能黑洞
算法
怕浪猫1 小时前
我有个朋友,工作八年,公司从 300 人减到 80 人
面试·程序员
IT枫斗者枫哥1 小时前
CompletableFuture失败后返回空列表:异常没了,业务含义也变了
java·后端