和为S的两个数字
/*
* 和为S的两个数字
* 题目描述
* 输入一个递增排序的数组和一个数字S,在数组中查找两个数
* 使得他们的和正好是S,如果有多对数字的和等于S,输出两个
* 数的乘积最小的。
*
解法一:
//方法一:采用双重遍历找到第一组满足条件的两个数即为乘积最小两个数 public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { ArrayList list = new ArrayList();//初始化的默认值为空 if(array.length<2 || sum<array[0]+array[1]) return list; boolean flag = false; for(int i=0;i<array.length-1;i++) { if(flag == true) break; for(int j=i+1;j<array.length;j++) { if(array[i]+array[j]==sum) { list.add(array[i]); list.add(array[j]); flag = true; break; } } } return list; }
解法二:从数组两端向中间查找满足条件的两个数
/* * i,j表示数组两端下表 * 当array[i]+array[j]>S时,j-- 尾端向前移动,两数据和增大 * 当array[i]+array[j]=S时,将array[i],array[j]依次添加到ArrayList中 * 当array[i]+array[j]<S时,i++前段向后移动,两数据和减小 */ public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { ArrayList list = new ArrayList(); if(array.length<2 || sum<array[0]+array[1]) return list; int i=0; int j=array.length-1; while(i<j) { if(array[i]+array[j]>sum) j--; else if(array[i]+array[j]==sum) { list.add(array[i]); list.add(array[j]); break; } else { i++; } } return list; } }
解法三:同解法二既然是排序好的
分析:因为是递增数组,所以x,y相差越远越好,所得的乘积就越小,左右开始
mport 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 < 2) { return list; } int i=0,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; } }