【正确答案】
【答案解析】问题描述:给定一个数组{1,7,17,2,6,3,14},这个数组中满足条件的有两对组合——17+3=20和6+14=20。
方法一:“蛮力”法
最容易想到的方法就是采用两重循环遍历数组来判断两个数的和是否为20。实现代码如下:
public class Test{
public static void findSum(int[]a, int sum){
int len=a.length;
for(int i=0; i<len; i++)
for(int j=i; j<len; j++){
if(a[i]+a[j]==sum)
System.out.println(a[i]+", "+a[j]);
}
}
public static void main(String[]args){
int array[]={1, 7, 17, 2, 6, 3, 14};
findSum(array, 20);
}
}
程序运行结果为:
17, 3
6, 14
由于采用了双重循环,因此这个算法的时间复杂度为O(n^2)。
方法二:排序法
先对数组元素进行排序,可以选用堆排序或快速排序,此时算法的时间复杂度为O(nlogn),然后对排序后的数组分别从前到后和从后到前遍历,假设从前往后遍历的下标为begin,从后往前遍历的下标为end,那么当满足arr[begin]+arr[end]<20时,如果存在两个数的和为20,那么这两个数一定在[begin+1,end]之间;当满足arr[begin]+arr[end]>20时,如果存在两个数的和为20,那么这两个数一定在[begin,end+1]之间。这个过程的时间复杂度为O(n),因此整个算法的时间复杂度为O(nlogn)。实现代码如下:
import java.util.Arrays;
public class Test{
public static void findSum(int[]a, int sum){
Arrays.sort(a);
int begin=0;
int end=a.length-1;
while(begin<end){
if(a[begin]+a[end]<sum)
begin++;
else if(a[begin]+a[end]>sum)
end--;
else{
System.out.println(a[begin]+", "+a[end]);
begin++;
end--;
}
}
}
public static void main(String[]args){
int array[]={1, 7, 17, 2, 6, 3, 14};
findSum(array, 20);
}
}
程序运行结果为:
3, 17
6, 14
这个算法的时间复杂度主要由排序算法的时间复杂度来决定。因此,选择时间复杂度较低的排序算法能显著提高该算法的效率。