题目:和为s的数字
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使它们的和为s。如果有多对和为s,输入任意一对即可。
思路:
使用两个指针分别指向数组的头、尾。如果和大于s,头部指针后移,如果和小于s,尾部指针前移。
基于以上思路,java参考代码如下:
package chapter6;
public class P280_FindNumbersWithSum {
public static int[] findNumbersWithSum(int[] arr,int target){
if(arr==null||arr.length<2) return null;
int[] res=new int[]{-1,-1};
int start=0,end=arr.length-1;
while (start<end){
if(arr[start]+arr[end]==target){// arr[start]+arr[end]防止溢出,最好用long型的变量保存。例如:long temp=arr[start]+arr[end];
res[0]=arr[start];
res[1]=arr[end];
return res;
}else if(arr[start]+arr[end]>target){
end--;
}else {
start++;
}
}
return res;
}
public static void main(String[] args) {
int[] res=findNumbersWithSum(new int[]{1,2,4,7,11,15},15);//target=15
System.out.println(res[0]);//4
System.out.println(res[1]);//11
}
}
测试用例:
a.功能测试(数组中存在和为S的两个数;数组中不存在和为S的两个数)。
b.特殊输入测试(表示数组的指针为nullptr指针)。
相关题目:
LeetCode第一题TwoSum,两数之和,相对于本题来说,没有递增这个条件。
java参考代码如下:
package chapter6;
import java.util.HashMap;
public class P280_TwoSum {
public static int[] twoSum(int[] arr,int target){
if(arr==null||arr.length<2) return null;
HashMap<Integer,Integer> map=new HashMap<>();
int[] res=new int[]{-1,-1};
// for(int i=0;i<arr.length;i++){
// map.put(arr[i],i);
// }
for(int i=0;i<arr.length;i++){
if(map.containsKey(target-arr[i])){
res[0]=map.get(target-arr[i]);
res[1]=i;
break;
//return res;
}
map.put(arr[i],i);
}
return res;
}
public static void main(String[] args) {
int[] res=twoSum(new int[]{1,2,7,11,15,16},9);//targer=9
System.out.println(res[0]);
System.out.println(res[1]);
}
}