给一个数组,和一个数字,找数组里面和为这个数字的2个数
/**
* 暴力法两个for循环找
* @param arrays 数组
* @param sum 和
* @return 两个数字
*/
public ArrayList<Integer> getSum(Integer[] arrays,Integer sum){
for (int i = 0; i < arrays.length; i++) {
for (int j = i+1; j < arrays.length; j++ ){
int c;
c = arrays[i] + arrays[j];
if(c==sum){
ArrayList<Integer> integers = new ArrayList<>();
integers.add(arrays[i]);
integers.add(arrays[j]);
return integers;
}
}
}
return null;
}
/**
* 等价于找c = sum - arrays[i] 穷举
* @param arrays
* @param sum
* @return
*/
public ArrayList<Integer> getSum(Integer[] arrays,Integer sum){
//排序,看数据大小,大于32用mergeSort ,小于用mini-TimSort
Arrays.sort(arrays);
ArrayList<Integer> integersList = new ArrayList<>();
for (int i = 0; i < arrays.length; i++) {
int c = sum - arrays[i];
//二分查找
int ci = Arrays.binarySearch(arrays, c);
if (ci>=0) {
integersList.add(arrays[ci]);
integersList.add(arrays[i]);
return integersList;
}
}
return null;
}
/**
* 首尾arrays[i] + arrays[j]和,小了i++,大了 j--
* @param arrays
* @param sum
* @return
*/
public ArrayList<Integer> getSum(Integer[] arrays,Integer sum){
Arrays.sort(arrays);
ArrayList<Integer> integersList = new ArrayList<>();
for (int i = 0 , j = arrays.length - 1; i < j; ) {
if(arrays[i] + arrays[j] > sum){
j--;
}else if(arrays[i] + arrays[j] < sum){
i++;
}else {
integersList.add(arrays[i]);
integersList.add(arrays[j]);
return integersList;
}
}
return null;
}
4.如果找3个数的话,getSum可以多带一个参数i,这样保证每个数不同
/**
*
* @param arrays
* @param sum
* @return
*/
public ArrayList<Integer> getSum(Integer[] arrays,Integer sum){
for (int i = 0; i < arrays.length; i++) {
int c = sum - arrays[i];
//二分查找
int ci = Arrays.binarySearch(arrays, c);
if (ci>=0) {
ArrayList<Integer> objects = new ArrayList<>();
objects.add(arrays[ci]);
objects.add(arrays[i]);
return objects;
}
}
return new ArrayList<Integer>();
}
/**
* 如果是3个数的话
* @param arrays
* @param sum
* @return
*/
public ArrayList<Integer> getSumResult(Integer[] arrays,Integer sum){
Arrays.sort(arrays);
for (int i = 0; i < arrays.length; i++) {
int n = sum - arrays[i];
ArrayList<Integer> sum1 = getSum(arrays, n);
if(sum1.size()>0){
sum1.add(arrays[i]);
return sum1;
}
}
return null;
}