题目链接:https://leetcode-cn.com/problems/he-wei-sde-liang-ge-shu-zi-lcof/
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
解题过程
遍历时使用二分查找
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
for (int num : nums) {
if (num < target) {
int other = target - num;
if (binSearchEqual(nums, 0, nums.length, other)){
res[0] = num;
res[1] = other;
return res;
}
}
}
return res;
}
private boolean binSearchEqual(int[] nums, int left, int right, int target){
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return true;
} else if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid;
}
}
return false;
}
}
使用双指针
前后分别设置一个指针,计算其和,如果大于target,则移动后面的指针;如果小于target,则移动前面的指针。
class Solution {
public int[] twoSum(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target){
return new int[]{nums[left], nums[right]};
} else if (sum > target){
right -= 1;
} else{
left += 1;
}
}
return new int[2];
}
}