1.TwoSumII 167问题
题目:给定一个升序数组arr,和一个数字num。从arr中找到两个数字使其和等于num,返回这两个数的索引位置。数组中一定有解且唯一,同一个数不能使用两次。
解答:常用的方法有三种:
- l 最容易想到的是暴力破解。对于每一个数字num,在数组中按序遍历查找num-arr[i],缺点是没有使用到升序这一条件。时间复杂度是O(n2)
- l 上边进行优化,可以使用二分查找搜索num-arr[i].二分法时间复杂度log(n),遍历数组是n,所以时间复杂度是nlog(n).
- l 采用碰撞指针i j,分别指向首尾,如果arr[i]+arr[j]>num证明和太大,将j减小,使得和变小后再计算,反之将i增大之后再
public class TwoSumII167
{
public int[] twoSum(int[] arr, int num)
{
int i = 0;
int j = arr.length - 1;
while (arr[i] + arr[j] != num && j != i)
{
if (arr[i] + arr[j] > num)//太大了,那就把连个数字调小一点
j--;
else
i++;
}
int[] index = new int[2];
index[0] = i;
index[1] = j;
return index;
}
}