做网站多少钱赚钱吗,敬请期待的英语,普兰店网站建设,wordpress如何上传文件大小一、题目描述
给你一个下标从 1 开始的整数数组 numbers #xff0c;该数组已按 非递减顺序排列 #xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] #xff0c;则 1 index1 index…一、题目描述
给你一个下标从 1 开始的整数数组 numbers 该数组已按 非递减顺序排列 请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] 则 1 index1 index2 numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。 示例 1
输入numbers [2,7,11,15], target 9
输出[1,2]
解释2 与 7 之和等于目标数 9 。因此 index1 1, index2 2 。返回 [1, 2] 。
示例 2
输入numbers [2,3,4], target 6
输出[1,3]
解释2 与 4 之和等于目标数 6 。因此 index1 1, index2 3 。返回 [1, 3] 。
示例 3
输入numbers [-1,0], target -1
输出[1,2]
解释-1 与 0 之和等于目标数 -1 。因此 index1 1, index2 2 。返回 [1, 2] 。提示
2 numbers.length 3 * 10^4-1000 numbers[i] 1000numbers 按 非递减顺序 排列-1000 target 1000仅存在一个有效答案
二、解题思路
由于数组已经按照非递减顺序排列因此可以使用双指针的方法来找到两个数。一个指针指向数组的起始位置另一个指针指向数组的末尾位置。然后根据两个指针指向的数字之和与目标值进行比较如果两个数字之和等于目标值则返回这两个数字的索引如果两个数字之和小于目标值则将左侧的指针向右移动一位如果两个数字之和大于目标值则将右侧的指针向左移动一位。直到找到满足条件的两个数字为止。
三、具体代码
public class Solution {public int[] twoSum(int[] numbers, int target) {int left 0, right numbers.length - 1;while (left right) {int sum numbers[left] numbers[right];if (sum target) {return new int[]{left 1, right 1};} else if (sum target) {left;} else {right--;}}return new int[]{-1, -1};}
}四、时间复杂度和空间复杂度
1. 时间复杂度
该算法使用双指针遍历数组每个指针从数组的两端开始向中间移动直到找到满足条件的两个数字或者两个指针相遇。在最坏的情况下每个指针都需要移动到数组的中间位置因此时间复杂度是 O(n)其中 n 是数组的长度。
2. 空间复杂度
该算法只使用了几个额外的变量left, right, sum不管输入数组的大小如何这些变量的空间占用是固定的。因此空间复杂度是 O(1)即常数级别的额外空间。
综上所述该算法的时间复杂度是 O(n)空间复杂度是 O(1)。
五、总结知识点 双指针技巧这是一种常用的算法技巧用于在有序数组中查找两个数使得它们的和等于给定目标。一个指针从数组的开始位置向后移动另一个指针从数组的末尾向前移动。 循环控制使用while循环来控制双指针的移动直到找到满足条件的两个数或者两个指针相遇。 条件语句使用if-else语句来根据两个指针指向的数的和与目标值的关系来决定指针的移动方向。 数组合并使用数组初始化语法new int[]{left 1, right 1}来创建并返回结果数组。 数组索引代码中使用了数组的索引来访问和比较数组中的元素。 整数加法计算两个指针指向的数的和。 异常处理虽然代码中没有显式的异常处理但是通过返回{-1, -1}来隐式地处理了找不到满足条件的情况。 算法思想代码实现了一种基于有序数组的二分查找思想的变体即通过双指针减少查找范围从而提高查找效率。
以上就是解决这个问题的详细步骤希望能够为各位提供启发和帮助。