第2章 数字之魅——快速寻找满足条件的两个数

快速寻找满足条件的两个数

问题描述

  能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字,为了简化起见,我们假设这个数组中肯定存在这样一组或以上符合要求的解。

分析与解法

【解法一】

代码如下:

 1 package chapter2shuzizhimei.findtwonumber;
 2 /**
 3  * 快速寻找满足条件的两个数
 4  * 【解法一】
 5  * @author DELL
 6  *
 7  */
 8 public class FindTowNumber1 {
 9     //定义一个二元组类
10     public static class Tuple{
11         public double a;
12         public double b;
13         public Tuple(double a, double b){
14             this.a = a;
15             this.b = b;
16         }
17     }
18     //寻找满足条件的两个数
19     public static Tuple find(double a[],double sum){
20         int n = a.length;
21         for(int i=0;i<n;i++){
22             for(int j=i+1;j<n;j++){
23                 if(a[i]+a[j]==sum){
24                     Tuple t = new Tuple(a[i],a[j]);
25                     return t;
26                 }
27             }
28         }
29         return null;
30     }
31     public static void main(String[] args) {
32         double a[] = {3,8,4,9,12,5,1};
33         double sum = 10;
34         Tuple t = find(a,sum);
35         System.out.println("数组中和为:"+sum+"的两个数为:"+t.a+" "+t.b);
36 
37     }
38 
39 }

程序运行结果如下:

数组中和为:10.0的两个数为:9.0 1.0

【解法二】

完整代码如下:

 

 1 package chapter2shuzizhimei.findtwonumber;
 2 /**
 3  * 快速寻找满足条件的两个数
 4  * 【解法二】
 5  * @author DELL
 6  *
 7  */
 8 public class FindTowNumber2 {
 9     //定义一个二元组类
10     public static class Tuple{
11         public double a;
12         public double b;
13         public Tuple(double a, double b){
14             this.a = a;
15             this.b = b;
16         }
17     }
18     
19     //快速排序的一次划分
20     public static int partition(double a[], int first, int last) {
21         double temp = a[first];
22         int i = first, j = last;
23         while (i < j) {
24             while (i < j && a[j] >= temp) {
25                 j--;
26             }
27             if (i < j)
28                 a[i] = a[j];
29             while (i < j && a[i] <= temp) {
30                 i++;
31             }
32             if (i < j)
33                 a[j] = a[i];
34         }
35         a[i] = temp;
36         return i;
37     }
38 
39     // 快速排序
40     public static void quickSort(double a[], int first, int last) {
41         if (first >= last)
42             return;
43         int i = partition(a, first, last);
44         quickSort(a, first, i - 1);
45         quickSort(a, i + 1, last);
46     }
47     
48     //寻找满足条件的两个数
49     public static Tuple find(double a[],double sum){
50         int n = a.length;
51         quickSort(a,0,n-1);  //从小到大排序
52         int i,j;
53         for(i=0,j=n-1;i<j;){
54             if(a[i]+a[j]==sum){
55                 Tuple t = new Tuple(a[i],a[j]);
56                 return t;
57             }else if(a[i]+a[j]>sum){
58                 j--;
59             }else{
60                 i++;
61             }
62         }
63         return null;
64     }
65     public static void main(String[] args) {
66         double a[] = {3,8,4,9,12,5,1};
67         double sum = 9;
68         Tuple t = find(a,sum);
69         System.out.println("数组中和为:"+sum+"的两个数为:"+t.a+" "+t.b);
70 
71     }
72 
73 }

程序运行结果如下:

数组中和为:9.0的两个数为:1.0 8.0

 

posted @ 2015-07-07 10:46  ~风轻云淡~  阅读(313)  评论(0编辑  收藏  举报