题目
给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
示例 1:
输入:numbers = [2,7,11,15], target = 9 输出:[1,2] 解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
示例 2:
输入:numbers = [2,3,4], target = 6 输出:[1,3]
示例 3:
输入:numbers = [-1,0], target = -1 输出:[1,2]
提示:
2 <= numbers.length <= 3 * 104 -1000 <= numbers[i] <= 1000 numbers 按 非递减顺序 排列 -1000 <= target <= 1000 仅存在一个有效答案
自己想的:暴力双重循环
思路
略
代码
public int[] twoSum(int[] numbers, int target) { int brr[]=new int[2]; for (int i=0;i<numbers.length;i++){ for (int j=i+1;j<numbers.length;j++){ if (numbers[i]+numbers[j]==target){ brr[0]=i+1; brr[1]=j+1; return brr; } } } return brr; }
效果
执行用时:183 ms, 在所有 Java 提交中击败了11.41%的用户
内存消耗:38.8 MB, 在所有 Java 提交中击败了8.49%的用户
通过测试用例:19 / 19
优缺点
缺点:没有用到数组是排序好的这个条件
官方:双指针
思路
定义两个指针
left:开始在数组最左
right:开始在数组最右
开始循环,循环条件是left<ight
如果left的值+right的值==target,那就返回left+1,right+1(因为题目要求的是返回位置,而不是下标)
如果left的值+right的值>target,那就让right向左走
如果left的值+right的值<target,那就让left向右走
代码
public int[] twoSum(int[] numbers, int target) { int arr[]=new int[2]; int left=0; int right = numbers.length-1; while (left<right){ if (numbers[left]+numbers[right]==target){ arr[0]=left+1; arr[1]=right+1; break; } if (numbers[left]+numbers[right]>target){ right--; } if (numbers[left]+numbers[right]<target){ left++; } } return arr; }
效果
执行用时:1 ms, 在所有 Java 提交中击败了64.17%的用户
内存消耗:39 MB, 在所有 Java 提交中击败了5.29%的用户
通过测试用例:19 / 19