输入一个递增排序的数组和一个数字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^5
1 <= nums[i] <= 10^6
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题大概算是两数之和的进阶吧。所以两数之和的方法也可以做。
只不过如果利用题目给的递增的条件,可以用双指针同时从两边开始遍历,指针指向元素的和大于target,右指针左移,否则左指针右移。如果等于,直接返回。
哈希表:
class Solution { public int[] twoSum(int[] nums, int target) { Set<Integer> set = new HashSet<>(); int[] res = new int[2]; for (int x : nums) { if (set.contains(target - x)) { res[0] = x; res[1] = target - x; break; } set.add(x); } return res; } }
双指针:
class Solution { public int[] twoSum(int[] nums, int target) { int p1 = 0; int p2 = nums.length - 1; while (p1 < p2) { int tem = nums[p1] + nums[p2]; if (tem > target) { p2 --; } else if (tem < target) { p1 ++; } else { break; } } return new int[] {nums[p1], nums[p2]}; } }
标签:p2,p1,target,nums,int,res,57,Offer,--- From: https://www.cnblogs.com/allWu/p/17277274.html