1. 如果数组没有排序,可以先进行排序,可以用快速排序或者堆排序的方法进行排序,然后分别从有序数组头尾向中间遍历,相加,等于就输出,大于sum 就end--,小于sum就start++。这样的话,排序时间复杂度为O(n*log),遍历时间复杂度为O(n/2),所以总的时间复杂度为O(n*log)+O(n/2),即O(n*log)。
代码:
package JianZhiOffer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class FindNumbersWithSum
{
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum)
ArrayList<Integer> list=new ArrayList<Integer>();
int len=array.length;
int start=0;
int end=len-1;
int mul=0;
while(start<end&&start<len-1&&end>0)
{
if((array[start]+array[end])==sum)
{
list.add(array[start]);
list.add(array[end]);
return list;
}
if((array[start]+array[end])<sum)
{
start++;
}
else if((array[start]+array[end])>sum)
{
end--;
}
}
return list;
}
}
2. 要求返回这些组合中乘积最小的组合,并且小的先输出,大的后输出,这时候用第一种方法就不好做了,且需借助于Collections的方法
public static <T> void sort(List<T> list,
Comparator<? super T> c)
代码:
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum)
{
ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
for(int i=0;i<array.length;i++)
{
ArrayList<Integer> list = new ArrayList<Integer>();
for(int j=i+1;j<array.length;j++)
{
if(array[i] + array[j] == sum)
{
list.add(array[i]);
list.add(array[j]);
list.add(array[i] * array[j]);
}
}
if(!list.isEmpty())
lists.add(list);
}
if(lists.size() ==0)
return new ArrayList<Integer>();
//通过这一步达到排序的效果
Collections.sort(lists, new Comparator<ArrayList<Integer>>() {
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
return o1.get(2).compareTo(o2.get(2));
}
});
ArrayList<Integer> result = new ArrayList<Integer>();
ArrayList<Integer> temp = lists.get(0);
for(int i=0;i<temp.size() -1;i++){
result.add(temp.get(i));
}
return result;
}