暴力解法
public ArrayList<Integer> FindNumbersWithSum(int[] array,int sum) {
ArrayList<Integer> res = new ArrayList<>();
if (array == null || array.length == 0) {
return res;
}
long max = Long.MAX_VALUE;
for (int i = 0; i < array.length; i++) {
for (int j = array.length-1; j > i; j--) {
if (sum == array[i] + array[j] && array[i] * array[j] < max) {
res.clear();
res.add(array[i]);
res.add(array[j]);
max = array[i] * array[j];
break;
}
}
}
return res;
}
数列满足递增,设两个头尾两个指针i和j,
若ai + aj == sum,就是答案(相差越远乘积越小)
若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1
若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1
O(n)
public ArrayList<Integer> FindNumbersWithSum(int[] array,int sum) {
ArrayList<Integer> res = new ArrayList<>();
if (array == null || array.length == 0) return res;
int i = 0, j = array.length - 1;
while (i < j) {
if (array[i] + array[j] == sum) {
res.add(array[i]);
res.add(array[j]);
break;
}
while (i < j && array[i] + array[j] > sum) --j;
while (i < j && array[i] + array[j] < sum) ++i;
}
return res;
}
和为S的两个数字
最新推荐文章于 2022-01-06 17:43:38 发布