链接
牛客:和为S的两个数字
LeetCode:剑指 Offer 57. 和为s的两个数字
思路
这道题算是 Two Sum 问题的一个变种,区别在于这是个有序数组,而且如果存在不止一个结果,需要找到两个数乘机最小的,这意味着两个数字的差异尽可能的大,我们可以利用双指针的方法来解决这个问题,初始化两个指针分别是第一个和最后一个,然后从两边向中间不断查找。
代码
牛客:
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
ArrayList<Integer> list = new ArrayList<Integer>();
int first = 0, second = array.length - 1;
while (first < second) {
int curSum = array[first] + array[second];
if (curSum == sum) {
list.add(array[first]);
list.add(array[second]);
break;
} else if (curSum > sum) {
second--;
} else {
first++;
}
}
return list;
}
}
LeetCode:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
int first = 0, second = nums.length - 1;
while (first < second) {
int curSum = nums[first] + nums[second];
if (curSum == target) {
result[0] = nums[first];
result[1] = nums[second];
break;
} else if (curSum > target) {
second--;
} else {
first++;
}
}
return result;
}
}