1、实践题目
两数之和
2、问题描述
给你一个下标从 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] 。
3、算法描述
初始时两个指针分别指向第一个元素位置和最后一个元素的位置。每次计算两个指针指向的两个元素之和,并和目标值比较。如果两个元素之和等于目标值,则发现了唯一解。如果两个元素之和小于目标值,则将左侧指针右移一位。如果两个元素之和大于目标值,则将右侧指针左移一位。移动指针之后,重复上述操作,直到找到答案。
4. 算法时间及空间复杂度分析
-
时间复杂度:O(n)
-
空间复杂度:O(1)
5、代码实现
`public class 两数之和 {
public static int[] twoSum(int[] arr, int target) {
int i = 0, j = arr.length - 1;
while (i < j) {
int sum = arr[i] + arr[j];
if (sum == target) {
return new int[]{i + 1, j + 1};
} else if (sum < target) {
i++;
} else {
j--;
}
}
return new int[]{-1, -1};//如果和没有等于target就返回数组{-1,-1}
}
public static void showArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void main(String[] args) {
int []arr= {2,7,11,15};
int target=9;
showArr(twoSum(arr,target));
}
}`
6、程序运行截图
7、心得体会
一开始想的是最容易想到的也就是最笨的方法:双层for循环,时间复杂度为:O(n^2) 。当数据量大时需要更多的时间,算法效率太慢;而使用双指针即可大大提升算法效率