【每日一题Day259】LC167两数之和 II - 输入有序数组 | 双指针 二分查找

简介: 【每日一题Day259】LC167两数之和 II - 输入有序数组 | 双指针 二分查找

两数之和 II - 输入有序数组【LC167】

给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。

函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。


你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。


作者:力扣 (LeetCode)

链接:https://leetcode-cn.com/leetbook/read/array-and-string/cnkjg/

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三个时间段的三种答案 神奇

  • 我的题解
  • 暴力
  • 2021/11/15
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int[] index = {0,0};
        for(int i =0;i<numbers.length;i++){
            for(int j=i+1;j<numbers.length;j++){
                if(numbers[i]+numbers[j] == target){
                    index[0] = i+1;
                    index[1] = j+1;
                }
            }
        }
        return index;
    }
}

image.png

双指针

2022/10/18

由于数组从小到大排列, 设置双指针分别指向数组的首部(left)和尾部(right)

  • 若首部尾部相加等于目标值,返回结果集
  • 若首部尾部相加小于目标值,右移left,使和变大
  • 若首部尾部相加大于目标值,左移right,使和减小
  • 代码
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int[] res = new int[2];
        int len = numbers.length;
        int left = 0;
        int right = len-1;
        while(left < right){
            if (numbers[left] + numbers[right] == target){
                res[0] = left;
                res[1] = right;
                return res;
            }else if(numbers[left] + numbers[right] > target){
                right--;
            }else {
                left++;
            }
        }
        return res;
    }
}
  • 复杂度
  • 时间复杂度:O(n),其中 n是数组的长度。两个指针移动的总次数最多为 n次。
  • 空间复杂度:O(1)
二分查找

2023/7/8

依次遍历数组中的元素,然后使用二分法查找数组中是否存在元素的数值为targe-numbers[i]

  • 若存在,则返回结果
  • 若不存在,则继续遍历
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int n = numbers.length;
        for (int i = 0; i < n; i++){
            int index = search(numbers, target - numbers[i], i + 1, n - 1);
            if (index != -1){
                return new int[]{i + 1, index + 1};
            }
        }
        return null;
    }
    public int search(int[] nums, int target, int l, int r){
        while (l <= r){
            int mid = (l + r) >> 1;
            if (nums[mid] == target){
                return mid;
            }else if (nums[mid] > target){
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        return -1;
    }
}

image.png

二分查找+双指针
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int i = 0, j = numbers.length - 1;
        while (i < j) {
            int m = (i + j) >>> 1;
            if (numbers[i] + numbers[m] > target) {
                j = m - 1;
            } else if (numbers[m] + numbers[j] < target) {
                i = m + 1;
            } else if (numbers[i] + numbers[j] > target) {
                j--;
            } else if (numbers[i] + numbers[j] < target) {
                i++;
            } else {
                return new int[]{i + 1, j + 1};
            }
        }
        return new int[]{0, 0};
    }
}
https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/solution/liang-shu-zhi-he-ii-shu-ru-you-xu-shu-zu-by-leet-2/502315

image.png

目录
相关文章
|
7月前
|
算法
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
|
7月前
|
索引 容器
双指针解决leetcode1两数之和
双指针解决leetcode1两数之和
49 0
|
7月前
|
机器学习/深度学习
【每日一题Day196】LC2106摘水果 | 枚举+前缀和数组 同向双指针+二分查找
【每日一题Day196】LC2106摘水果 | 枚举+前缀和数组 同向双指针+二分查找
59 0
|
7月前
|
算法 C++
双指针算法·两数之和·三数之和
双指针算法·两数之和·三数之和
56 0
|
7月前
LeetCode刷题---80. 删除有序数组中的重复项 II(双指针)
LeetCode刷题---80. 删除有序数组中的重复项 II(双指针)
|
7月前
LeetCode刷题---26. 删除有序数组中的重复项(双指针)
LeetCode刷题---26. 删除有序数组中的重复项(双指针)
|
7月前
|
算法 测试技术 C#
【二分查找】【双指针】LeetCode:2565最少得分子序列
【二分查找】【双指针】LeetCode:2565最少得分子序列
|
7月前
|
算法 机器人 测试技术
二分查找|双指针:LeetCode:2398.预算内的最多机器人数目
二分查找|双指针:LeetCode:2398.预算内的最多机器人数目
|
7月前
|
算法 测试技术 C#
[二分查找双指针]LeetCode881: 救生艇
[二分查找双指针]LeetCode881: 救生艇
|
7月前
|
存储
【每日一题Day294】LC88合并两个有序数组 | 双指针
【每日一题Day294】LC88合并两个有序数组 | 双指针
46 0