题目:
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路:
根据题目要求的特殊性,考虑快速排序的思想,i在数组最左端,j在数组最右端,i,j依次向中间靠拢。
Java
package nowcoder;
import java.util.ArrayList;
public class S42_FindNumbersWithSum {
public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum){
ArrayList<Integer> list = new ArrayList<Integer>();
if (array.length == 0 || array == null)
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)
j--;
else i++;
}
return list;
}
public static void main(String[] args){
S42_FindNumbersWithSum s42 = new S42_FindNumbersWithSum();
int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
System.out.println(s42.FindNumbersWithSum(array, 11));
}
}
Python
class FindNumbersWithSum:
def FindNumbersWithSum(self, array, tsum):
list = []
if not array or len(array) == 0:
return list
i = 0
j = len(array)-1
while i < j:
if array[i] + array[j] == tsum:
list.append(array[i])
list.append(array[j])
return list
elif array[i] + array[j] > tsum:
j -= 1
else: i += 1
return list
if __name__ == '__main__':
test = FindNumbersWithSum()
array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(test.FindNumbersWithSum(array, 10))