题目描述: (1) 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
(2)函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers
= [2, 7, 11, 15
], target
= 9
输出:
[1,2
]
解释: 2 与 7 之和等于目标数 9 。因此 index1
= 1, index2
= 2 。
简单的方法:
class Solution
{
public int
[] twoSum
(int
[] numbers, int target
) {
int
[] arrays
= new int
[2
];
for
(int i
=0
; i
<numbers.length
; i++
){
for
(int j
=0
; j
<numbers.length
; j++
){
if
(numbers
[i
]+numbers
[j
] == target
&& i
!=j
){
if
(i
>j
){
arrays
[0
] = j+1
;
arrays
[1
] = i+1
;
}
else
{
arrays
[1
] = j+1
;
arrays
[0
] = i+1
;
}
return arrays
;
}
}
}
return arrays
;
}
}
双指针的方法
class Solution
{
public int
[] twoSum
(int
[] numbers, int target
) {
int low
= 0, high
= numbers.length - 1
;
while (low
< high
) {
int
sum = numbers
[low
] + numbers
[high
];
if (sum
== target
) {
return new int
[]{low + 1, high + 1
};
} else if (sum
< target
) {
++low
;
} else {
--high
;
}
}
return new int
[]{-1, -1
};
}
}
1. 初始时两个指针分别指向第一个元素位置和最后一个元素的位置
2. 每次计算两个指针指向的两个元素之和,并和目标值比较。
3. 如果两个元素之和等于目标值,则发现了唯一解。
4. 如果两个元素之和小于目标值,则将左侧指针右移一位。
5. 如果两个元素之和大于目标值,则将右侧指针左移一位。
6. 移动指针之后,重复上述操作,直到找到答案。