【LeetCode】#167 有序两数之和

方法一 :二分查找法

时间复杂度O(n)
空间复杂度 O(1) 只用了2个指针变量

错误

错误原因:找的元素不能包括本身 l = i+1;
所以进行二分查找值 ( target- numbers[i] )的时候不能包括numbers[i]

O(N^2)

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        for(int i =0;i<numbers.length;i++){
            int l = i;  //错误
            int r = numbers.length;
            while(l<r){
                int mid = (r+l)/2;
                if(numbers[mid] > target - numbers[i]){
                    r = mid;
                }else if(numbers[mid] < target - numbers[i]){
                    l = mid;
                }else{
                    return new int[]{i+1,mid+1};
                }
            }
        }
        throw new IllegalArgumentException("No such two sum");
    }
}

二分查找法

  • 循环里左边小于右边;含有等号;
  • 边界变换的时候不加等号,既然都小于mid了,一定不包含mid;
    在这里插入图片描述
    这个则是 变换的时候包含等号,判断不包含
    在这里插入图片描述

方法二:双指针

O(n) 空间复杂度 O(1) 只用了2个指针变量
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值