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

问题描述

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

分析与解法

【解法一】

代码如下:

 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

转载于:https://www.cnblogs.com/gaopeng527/p/4626140.html

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

  1. 编程之美2.12 快速寻找满足条件的两个数

      这道题目的意思是,在一个数组中寻找两个数,使这两个数的和等于给定的数(找到任意一组就可以了).       题目读完之后,感觉这道题目还是很简单的,就是遍历数组呗,走两遍,即可以在O(n2)时间复 ...

  2. python 多条件 选择 算法_python部署python算法 - 快速寻找满足条件的两个数

    题目前提是一定存在这样两个数 解法一就不写了...一般想不到吧 一开始想到的是解法二最后的用hash表 (其实是想到创建一个跟target一样大的数组啦..存在就写入index,但是要全部找出,那得二 ...

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

    能否快速的在数组中找到两个数,让这两个数之和等于一个给定的数字. 解法1. 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为 给定的数字.  显然其时间复杂度为N(n-1)/2即O ...

  4. 程序员面试100题之十:快速寻找满足条件的两个数

    能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定S ...

  5. 【编程之美】2.12快速寻找满足条件的两个数

    给一个数组,找出其中一对和为sum的数字. 由于已经做过排好序的数组,找和为sum的题目.所以完全没有过多考虑就排了序,左右指针相互收缩着寻找. 跟答案上的方法也是一样的. /* start time ...

  6. 编程之美-快速寻找满足条件的两个数方法整理

    [问题描述] 方法一:时间复杂度O(n^2) 方法二:时间复杂度O(n),空间复杂度O(n) 方法三:时间复杂度O(nlogn)

  7. python同时满足两个条件_python算法-快速寻找满足条件的两个数

    题目前提是一定存在这样两个数 解法一就不写了...一般想不到吧 一开始想到的是解法二最后的用hash表 (其实是想到创建一个跟target一样大的数组啦..存在就写入index,但是要全部找出,那得二 ...

  8. 第2章 数字之魅——求二进制中1的个数

    求二进制中1的个数 问题描述 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. [解法一] 可以举一个八位的二进制例子来进行分析.对于二 ...

  9. 寻找20以内某两个数相除,其结果离黄金分割点0.618最近

    题目: 寻找某两个数相除,其结果 离黄金分割点 0.618最近: 要求:1)分母和分子不能同时为偶数 2)分母和分子 取值范围在[1-20] 分析:可采用嵌套for循环,分别遍历分子和分母,求出相除结 ...

最新文章

  1. 深入理解JavaScript类数组
  2. Linux ibm mq 教程,IBM MQ 使用指南
  3. SpringMVC处理自定义异常,通过读取配置文件把错误信息显示在前台页面
  4. react之bind函数到组件通识篇
  5. java 流 复制文件_【Java】使用字节流复制文件
  6. Spring mvc 注解@ResponseBody 返回内容编码问题
  7. MyEclipse 6.5安装maven插件
  8. 解决:There was an unexpected error (type=Internal Server Error,..). No instances available for XXX
  9. 去中心化抵押借贷市场当前总借款量94.24亿美元
  10. linux php adodb,【原创】Linux下php使用adodb对sql Server访问配置
  11. k-平均算法(k-means算法)(k均值算法)例题
  12. 2021瑞安高考成绩查询,2021年瑞安高考状元名单公布,瑞安文理科状元是谁多少分...
  13. flv转mp4视频格式转码教程
  14. Rqnoj341星门跳跃
  15. Molten 功能简介以及使用指南
  16. UWB DW1000 TWR测距定位功能实现
  17. .sh执行文件sed命令出错 bad flag in substitute command: ‘U‘ Mac终端
  18. LeetCode记录总结
  19. adguard拦截规则存在哪里_广告拦截软件Adguard怎样配置才能更全面的发挥作用
  20. Flutter 学习

热门文章

  1. *【HDU - 2819】Swap(二分图匹配,输出路径)(待证明:是否是最少交换次数?)
  2. 华为鸿蒙beta版发布会,华为HarmonyOS手机体验鸿蒙版微博:仅9.1MB 附华为鸿蒙发布会直播入口...
  3. php mysql int 日期格式化 string,MYSQL int类型字段的时间存放和显示 和 php的时间存放函数...
  4. java 前后的区别_java中前后++的区别
  5. rust 案例_RUST-X气相防锈产品落户中国,助力中国高端制造出口海外
  6. python os模块方法_python os模块方法总结
  7. Tomcat 6.0配置连建池的方式:
  8. postgresql兴建用户_PostgreSQL 12.2, 11.7, 10.12, 9.6.17, 9.5.21, 和 9.
  9. Linux 内存管理 | 物理内存、内存碎片、伙伴系统、SLAB分配器
  10. 【大总结3】leetcode解题总览(算法、剑指offer、SQL、多线程、shell)