剑指offer_1 和为 S 的两个数字
题目描述
输入一个递增排序的数组和一个数字 S,在数组中查找两个数,使得他们的和正好是 S。如果有多对数字的和等于 S,输出两个数的乘积最小的。
方法一:暴力解决
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> arr = new ArrayList<>();
for(int i=0;i<array.length;i++)
arr.add(array[i]);
for(int i = 0;i < arr.size();i++){
if(arr.get(i) > sum){
return list;
}
if(arr.contains(sum-arr.get(i))){
if(list.isEmpty())
{
list.add(arr.get(i));
list.add(sum-arr.get(i));
}
else if(list.get(0)*list.get(1)>arr.get(i)*sum-arr.get(i)){
list.clear();
list.add(arr.get(i));
list.add(sum-arr.get(i));
}
}
}
return list;
}
}
方法二:
解题思路
使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值,指向较小的指针从头遍历到尾,指向较大元素的指针从尾向头遍历
如果两个指针指向的元素的和sum==target,那么得到的要求的结果
如果sum>target,移动较大的元素使得sum变小一点
如果sum<target,移动较小的元素使得sum变大一点
1 public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) { 2 int i = 0, j = array.length - 1; 3 while (i < j) { 4 int cur = array[i] + array[j]; 5 if (cur == sum) 6 return new ArrayList<>(Arrays.asList(array[i], array[j])); 7 if (cur < sum) 8 i++; 9 else 10 j--; 11 } 12 return new ArrayList<>(); 13 }

浙公网安备 33010602011771号