题目描述:
解题思路:
easy难度的题,三种方法,第一种暴力求解,两层for循环。第二种方法是二分法,先确定一个数,然后二分求出另一个数。第三种方法是利用双指针,因为这个题有个条件:数组是升序排序的,那么当0<i,<j<arr.length-1;如果arr[i]+arr[j]<target,那么arr[i-1]+arr[j]一定也小于target,反过来也一样。
参考代码:
//暴力
public static int[] twoSum(int[] numbers, int target) {
int[] arr=new int[2];
for(int i=0;i<numbers.length-1;i++)
{
for(int j=i+1;j<numbers.length;j++)
{
if(numbers[i]+numbers[j]==target)
{
arr[0]=i+1;
arr[1]=j+1;
break;
}
}
}
return arr;
}
//二分
public static int[] twoSum2(int[] numbers, int target) {
for (int i = 0; i < numbers.length; i++) {
int low=i+1;//i+1,是因为不能有重复的,下面的mid 和 i 不能重复,所有low=i+1
int hight=numbers.length-1;
while(low<=hight)
{
int mid = (hight - low) / 2 + low;
if(numbers[mid]+numbers[i]==target)
{
return new int[]{i+1,mid+1};
}
else if (numbers[i]+numbers[mid]>target)
{
hight=mid-1;
}
else
{
low=mid+1;
}
}
}
return new int[]{-1,-1};
}
//双指针
public static int[] twoSum3(int[] numbers,int target){
if(numbers==null)
return null;
int first=0;
int second=numbers.length-1;
int sum=numbers[first]+numbers[second];
while (sum!=target)
{
if(sum<target)
first++;
if(sum>target)
second--;
sum=numbers[first]+numbers[second];
}
return new int[]{first+1,second+1};
}