剑指offer--第57题 和为s的数字
第57题 和为s的数字
题目 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路 首先应该都会想到用双层for循环的思路遍历数组来查找,但是这样的时间复杂度高。可以采用首尾同时进行,定义两个指针标志。具体过程可以见下面的例子。
自己写的Low代码
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(array==null||array.length==0||sum<array[0]) {
return list;
}
//如果存在的话
for(int i=0;i<array.length;i++) {
for(int j = i+1;j<array.length;j++) {
if(array[i]+array[j]==sum) {
list.add(array[i]);
list.add(array[j]);
return list;
}
if(array[i]+array[j]>sum) {
break;
}
}
}
return list;
}
}
根据剑指Offer提供的思路
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(array==null||array.length==0||sum<array[0]) {
return list;
}
int i=0;
int j=array.length-1;
//两边同时进行;
while(i<j) {
if(array[i]+array[j]==sum) {
list.add(array[i]);
list.add(array[j]);
return list;
}else if(array[i]+array[j]<sum) {
i++;
}else {
j--;
}
}
return list;
}
}
主要区别在于时间复杂度上,两边同时进行的思路很妙。
多思考,多尝试。