看了他人思路后,发现我的算法思路是真的渣到没谁了哦?真是异类般的存在…
题目
和为S的两个数字
描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
思路
个人思路(觉得好蠢的想法哦)因为数组有有序的,先判断中间的数与sum的比较,如果sum>arr[middle]说明需要在middle的右边查找,否则在左边查找。然后在进行乘积的判断…
-
- 数列满足递增,设两个头尾两个指针i和j,
- 若ai + aj == sum,就是答案(相差越远乘积越小)
- 若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1
- 若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1
代码
package com.wy.offer;
import java.util.ArrayList;
/**
* @author 沪旦铭
* @date 2018/4/11 12:58
*/
public class T41 {
public static void main(String[] args) {
// int []array = {1,2,4,5,6};
int []array = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
ArrayList<Integer> list = T41.FindNumbersWithSum2(array,21);
for(Integer i:list){
System.out.print( i+" " );
}
}
public static ArrayList<Integer> FindNumbersWithSum(int [] array, int sum) {
ArrayList<Integer> list = new ArrayList<Integer>();
int length = array.length;
if(length==0 || sum<array[0] ){
return list;
}
//和大于数组中间那个元素,说明需要前面的元素加后面的元素
if( array[length/2]<sum ){
for(int i=length/2;i<length;i++){
for(int j=0;j<length/2;j++){
if(array[i]+array[j]==sum){
list.add(array[j]);
list.add(array[i]);
}
}
}
}else{//从前面开始查找
for(int i=0;i<length/2;i++){
for(int j=i+1;j<length/2;j++){
if(array[i]+array[j]==sum){
list.add(array[j]);
list.add(array[i]);
}
}
}
}
if(!list.isEmpty()){
//输出乘积最小的...
int x = list.get(0)*list.get(1);
int n = list.get(0),m = list.get(1);
for(int i=2;i<list.size();i+=2){
if(list.get(i)*list.get(i+1)<x){
n = list.get(i);
m = list.get(i+1);
}
}
list.clear();
list.add(n);
list.add(m);
}
return list;
}
public static ArrayList<Integer> FindNumbersWithSum2(int [] array, int sum) {
ArrayList<Integer> list = new ArrayList<Integer>();
int length = array.length;
if(length==0 || sum<array[0] ){
return list;
}
int i = 0,j = length-1;
while (i<j){
if(array[i]+array[j]==sum){
list.add(array[i]);
list.add(array[j]);
break;
}
while (array[i]+array[j]<sum){
i++;
}
while (array[i]+array[j]>sum){
j--;
}
}
return list;
}
}