面试经典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};
}

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

相关推荐
IT学长编程2 分钟前
计算机毕业设计 沉浸式戏曲文化体验系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·毕业论文·计算机毕业设计论文·计算机毕业设计选题·计算机毕业设计开题报告
卿卿qing15 分钟前
【JavaScript】算法之贪心算法(贪婪算法)
算法
你知道“铁甲小宝”吗丶19 分钟前
【第33章】Spring Cloud之SkyWalking服务链路追踪
java·spring boot·spring·spring cloud·skywalking
郭小儒22 分钟前
VCNet论文阅读笔记
算法
尽蝶叙30 分钟前
C++:分苹果【排列组合】
开发语言·c++·算法
coffee_baby31 分钟前
化繁为简:中介者模式如何管理复杂对象交互
java·spring boot·microsoft·交互·中介者模式
ღ᭄ꦿ࿐Never say never꧂35 分钟前
微服务架构中的负载均衡与服务注册中心(Nacos)
java·spring boot·后端·spring cloud·微服务·架构·负载均衡
所待.38336 分钟前
小小扑克牌算法
java·算法
.生产的驴44 分钟前
SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认
java·javascript·spring boot·后端·rabbitmq·负载均衡·java-rabbitmq
.生产的驴44 分钟前
SpringBoot 消息队列RabbitMQ在代码中声明 交换机 与 队列使用注解创建
java·spring boot·分布式·servlet·kafka·rabbitmq·java-rabbitmq