题目
题解
大佬详细题解:面试题57. 和为 s 的两个数字(双指针 + 证明,清晰图解)
最简单的就是暴力解法、直接双重循环、显然时间复杂度是O(n^2)是不可取的。使用哈希表稍微好点,由于数组是有序序列、所以我们可以使用双指针一个在前一个在后。
解法一:
使用哈希表
public int[] twoSum02(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap<>();
for (int num : nums) {
if (num >= target){
break;
}
if (map.containsKey(num)){
return new int[]{map.get(num),num};
}
map.put(target - num,num);
}
return new int[]{};
}
解法二:双指针
因为是排好序的、所以一个从头开始一个从尾开始。
class Solution {
public int[] twoSum(int[] nums, int target) {
int l=0,r=nums.length - 1;
while (l<r){
int sum = nums[l] + nums[r];
if (sum == target){
return new int[]{nums[l],nums[r]};
}
if (sum > target) {
r--;
}else {
l++;
}
}
return new int[]{};
}
}