【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;
    【LeetCode】#167 有序两数之和_第1张图片
    这个则是 变换的时候包含等号,判断不包含
    【LeetCode】#167 有序两数之和_第2张图片

方法二:双指针

O(n) 空间复杂度 O(1) 只用了2个指针变量
【LeetCode】#167 有序两数之和_第3张图片

你可能感兴趣的:(LeetCode,leetcode,算法,指针)