LeetCode原题:
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。
示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
方法一:暴力遍历
我们使用双层for循环
代码如下:
public class Test {
public static void main(String[] args) {
int nums[]=new int[]{2,7,11,15};
int[] array=twoSum(nums,9);
for(int i=0;i<array.length;i++){
System.out.print(array[i]);
}
}
public static int[] twoSum(int[]nums,int target){
for(int i=0;i<nums.length;i++){
int sum=target-nums[i];
for(int j=i+1;j<nums.length;j++){
if(nums[j]==sum){
return new int[]{i+1,j+1};
}
}
}
return null;
}
这种方法简单粗暴,但是时间复杂度高,不建议
方法二:使用双指针方法
思路:
*创建一个左指针,指向数组的第一个位置
*创建一个右指针,指向数组最后一个位置
*在while循环中,判断左右指针相加
*相加==target,返回下标
*相加<target,left++
*相加>target,right--;
代码如下:
public class Test {
public static void main(String[] args) {
int nums[]=new int[]{2,7,11,15};
int[] array=twoSum(nums,9);
for(int i=0;i<array.length;i++){
System.out.print(array[i]);
}
}
//双指针方法
public static int[] twoIndex(int array[],int target){
int left=0;
int right=array.length-1;
while(left<=right){
if(array[left]+array[right]==target){
return new int[]{left+1,right+1};
}else if(array[left]+array[right]<target){
left++;
}else if(array[left]+array[right]>target){
right--;
}
}
return null;
}
总结:双指针真好用~