剑指 Offer 57. 和为s的两个数字
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可
Map集合的containsKey函数
二分查找法,每次只拿left和right的元素进行判断
Map集合
class Solution {
public int[] twoSum(int[] nums, int target) {
// Map集合
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
if(map.containsKey(target-nums[i])){
return new int[]{target-nums[i],nums[i]};
}else{
map.put(nums[i],i);
}
}
return new int[0];
}
}
二分查找法
// 二分查找法
int left=0;
int right=nums.length-1;
//利用排序的递增的这个性质,二分查找法进行sum
while(left<right){
int sum=nums[left]+nums[right];
if(sum == target){
return new int[]{nums[left],nums[right]};
}
//递增的性质,left++可以使得sum增大
if(sum<target){
left++;
//递增的性质,right--可以使得sum减少
}else {
right--;
}
}
return new int[]{nums[left],nums[right]};