Description
剑指 Offer 57. 和为s的两个数字
难度简单58收藏分享切换为英文接收动态反馈
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
限制:
1 <= nums.length <= 10^51 <= nums[i] <= 10^6Solution
双指针
执行结果:通过class Solution {public int[] twoSum(int[] nums, int target) {int left = 0, right = nums.length-1;int[] res = new int[2];while(left < right){if (nums[left] + nums[right] == target){res[0] = nums[left];res[1] = nums[right];break;}else if (nums[left] + nums[right] > target){ // 相加大于target,说明right指向的值过大right --;}else { //相加小于 target,说明 left 指向的值过小left ++;}}return res;}}
显示详情
执行用时:2 ms, 在所有 Java 提交中击败了97.28%的用户
内存消耗:55.3 MB, 在所有 Java 提交中击败了84.99%的用户
可以使用二分搜索,但对于数据量小的的数组采用二分搜索的效率很低
public class Solution{
public int[] twoSum(int[] nums, int target) {
int a = -1, b = -1;
for (int i = 0; i < nums.length; i ++){
a = nums[i];
int bi = Arrays.binarySearch(nums, i, nums.length, (target-a));
if (bi >= i && bi < nums.length){
b = nums[bi];
break;
}
}
if (a == -1 || b == -1)
return new int[]{};
return new int[]{a,b};
}
private int binarySearch(int[]nums, int lo, int hi, int target){
while(lo <= hi){
int mid = lo + ((hi-lo) >> 1);
if (nums[mid] > target)
hi = mid - 1;
else if (nums[mid] < target)
lo = mid + 1;
else
return mid;
}
return -1;
}
}
执行结果:通过
显示详情
执行用时:13 ms, 在所有 Java 提交中击败了24.37%的用户
内存消耗:55 MB, 在所有 Java 提交中击败了94.73%的用户
