题目:

题解:
1、双指针
解题思路:
- 计算和 s = nums[i] + nums[j];
- 若 s > target ,则指针 j 向左移动,即执行 j = j - 1;
- 若 s < target,则指针 i 向右移动,即执行 i = i + 1;
- 若 s = target ,立即返回数组 [nums[i], nums[j]];
复杂度分析:
- 时间复杂度 O(N) : N 为数组 nums 的长度;双指针共同线性遍历整个数组。
- 空间复杂度 O(1) : 变量 i, j 使用常数大小的额外空间。
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20class Solution {
public int[] twoSum(int[] nums, int target) {
int i = 0;
int j = nums.length - 1;
// 提前把大于target的排除,也可防止nums[i] + nums[j]时溢出
while (i < j && target < nums[j]) {
j--;
}
while (i < j) {
// 这个s很重要,如果这样写,后面判断都得计算nums[i] + nums[j],效率将会降低
int s = nums[i] + nums[j];
if (s > target){
j--;
}else if (s < target){
i++;
}else return new int[] {nums[i],nums[j]};// 不在前面定义,可以动态的节省空间
}
return new int[0];
}
}