目录

1 问题描述

2 解决方案

2.1 排序夹逼法

 


1 问题描述

输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数。如果有多对数的和等于输入的整数,输出任意一对即可。例如,如果输入数组[1,2,4,5,7,11,15]和整数15,那么由于4+11 = 15,因此输出4和11。


2 解决方案

2.1 排序夹逼法

首先将整数数组,使用合并排序进行从小打到的排序,然后对这个排完序的数组从两头往中间遍历,一旦出现两个数的和等于输入的那个整数,则立即输出这两个数,并结束遍历。

具体代码如下:

  1. package com.liuzhen.array_2;
  2.  
  3. public class TwoSumN {
  4. /*
  5. * 参数A:给定的一个从小到大排序的数组
  6. * 参数n:待求和数n
  7. * 函数功能:打印出A中两个元素,满足A[i]+A[j] = n
  8. */
  9. public void getTwoSumN(int[] A,int n){
  10. int start = 0;
  11. int end = A.length - 1;
  12. while(start < end){
  13. if(A[start] + A[end] == n){
  14. System.out.println("\n数组中元素A["+start+"]" +
  15. " + A["+end+"] = "+n+",A["+start+"] = "+A[start]+",A["+end+"] = "+A[end]);
  16. break;
  17. }
  18. else{
  19. if(A[start] + A[end] > n)
  20. end--;
  21. else
  22. start++;
  23. }
  24. }
  25. }
  26.  
  27. //归并排序
  28. public void mergeSort(int[] A){
  29. if(A.length > 1){
  30. int[] leftA = getHalfArray(A,0); //数组A的左半部分
  31. int[] rightA = getHalfArray(A,1); //数组A的右半部分
  32. mergeSort(leftA);
  33. mergeSort(rightA);
  34. getMerge(A,leftA,rightA);
  35. }
  36. }
  37.  
  38. /*
  39. * 参数A:要进行折半的数组
  40. * 参数judge:judge == 0表示返回数组A左上半部分,judge != 0表示返回数组A的右半部分
  41. * 函数功能:把数组按照长度均分为上半部分和下半部分
  42. */
  43. public int[] getHalfArray(int[] A,int judge){
  44. int[] result;
  45. if(judge == 0){
  46. result = new int[A.length/2];
  47. for(int i = 0;i < A.length/2;i++)
  48. result[i] = A[i];
  49. }
  50. else{
  51. result = new int[A.length - A.length/2];
  52. for(int i = 0;i < A.length - A.length/2;i++)
  53. result[i] = A[i+A.length/2];
  54. }
  55. return result;
  56. }
  57. /*
  58. *参数A:给定待排序数组
  59. *参数leftA:数组A的左半部分
  60. *参数rightA:数组的右半部分
  61. *函数功能:返回数组A的从小到大排序
  62. */
  63. public void getMerge(int[] A,int[] leftA,int[] rightA){
  64. int i = 0; //用于计算当前遍历leftA的元素个数
  65. int j = 0; //用于计算当前遍历rightA的元素个数
  66. int count = 0; //用于计算当前得到按从小到大排序的A的元素个数
  67. while(i < leftA.length && j < rightA.length){
  68. if(leftA[i] < rightA[j]){
  69. A[count++] = leftA[i];
  70. i++;
  71. }
  72. else{
  73. A[count++] = rightA[j];
  74. j++;
  75. }
  76. }
  77. if(i < leftA.length){
  78. while(i < leftA.length)
  79. A[count++] = leftA[i++];
  80. }
  81. if(j < rightA.length){
  82. while(j < rightA.length)
  83. A[count++] = rightA[j++];
  84. }
  85. }
  86.  
  87. public static void main(String[] args){
  88. TwoSumN test = new TwoSumN();
  89. int[] A = {2,1,7,4,6,1,2,4,3,6,8,4,2,1,7,3,4,6,8,3,4};
  90. test.mergeSort(A);
  91. System.out.println("对数组A进行合并排序后结果:");
  92. for(int i = 0;i < A.length;i++)
  93. System.out.print(A[i]+" ");
  94. test.getTwoSumN(A, 10);
  95. }
  96. }

运行结果;

  1. 对数组A进行合并排序后结果:
  2. 1 1 1 2 2 2 3 3 3 4 4 4 4 4 6 6 6 7 7 8 8
  3. 数组中元素A[3] + A[20] = 10,A[3] = 2,A[20] = 8

算法笔记_037:寻找和为定值的两个数(Java)的更多相关文章

  1. 算法笔记_041:寻找和为定值的多个数(Java)

    目录 1 问题描述 2 解决方案 1 问题描述 输入两个整数n和sum,要求从数列1,2,3,...,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题 ...

  2. 在数组中寻找和为定值的n个数

    /*-------------------------------------------------------*/ /*寻找和为定值的两个数 输入一个数组A[0,N-1]和一个数字Sum,在数组中 ...

  3. 编程之法section II: 2.2 和为定值的两个数

    ====数组篇==== 2.2 求和为定值的两个数: 题目描述:有n个整数,找出其中满足两数相加为target的两个数(如果有多组满足,只需要找出其中一组),要求时间复杂度尽可能低. 解法一: 思路: ...

  4. 【Data Structure & Algorithm】在排序数组中查找和为定值的两个数

    在排序数组中查找和为定值的两个数 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出 ...

  5. Java实现寻找和为定值的多个数

    1 问题描述 输入两个整数n和sum,要求从数列1,2,3,-,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题是典型的背包问题的应用,即先找出n个数 ...

  6. 【剑指offer】和为定值的两个数

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/24933341 题目描写叙述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的 ...

  7. 【剑指offer学习】求和为定值的两个数(拓展)

    接着上面一篇文章: http://blog.csdn.net/u013476464/article/details/40651451 接下来我们拓展一下题目,如果数组是乱序的,并且规定数组中的元素所有 ...

  8. 算法笔记_035:寻找最小的k个数(Java)

    目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法   1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 ...

  9. 算法笔记_031:计算中值和选择问题(Java)

    目录 1 问题描述  2 解决方案 2.1 计算中值问题 2.2 选择问题   1 问题描述 中值问题是求一个n个数列表中某一数组下标k,它要求该下标元素比列表中的一半元素大,又比另一半元素小,这个中 ...

随机推荐

  1. PHP 笔记——PDO操作数据库

    一.简介 ​ PHP 5.1可使用轻量级的统一接口 PDO(PHP Data Object,PHP数据对象)来访问各种常见的数据库.而使用PDO只需要指定不同的 DSN(数据源名称)即可访问不同的数据 ...

  2. 主席树+dfs SPOJ BZOJ2588 Count on a tree

    这道题我由于智障错误导致一直错. 在树上建主席树,加上lca思想,很简单. #include<bits/stdc++.h> using namespace std; ; struct no ...

  3. AtCoder Regular Contest 81

    链接 C.Make a Rectangle 给出一堆木棍的长度 从中选4根,询问在能围成矩形的情况下,矩形的最大面积 开个map统计一下就行 分正方形和矩形分别统计即可 复杂度$O(n \log n) ...

  4. [BZOJ5093]图的价值(NTT+第二类Stirling数)

    5093: [Lydsy1711月赛]图的价值 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 250  Solved: 130[Submit][Sta ...

  5. BZOJ 1030 [JSOI2007]文本生成器(AC自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...

  6. seebug的反爬虫技术初探

    1.通过request库无法直接爬取,返回521 >>> import requests >>> req = requests.get('https://www.s ...

  7. [转]Android:异步处理之AsyncTask的应用(二)

    2014-11-07     既然UI老人家都这么忙了,我们这些开发者肯定不能不识趣的去添乱阻塞UI线程什么的,否则UI界面万一停止响应了呢——这不是招骂的节奏么?!所以我们知道用Handler+Th ...

  8. [转]Intel haxm安装失败问题解决

    在安装Intel haxm为安卓模拟器加速时,会遇到提示VT-X未开启问题,问题提示如下图 工具/原料 Intel haxm 安卓模拟器 方法/步骤 1 确认你的处理器是否是Intel的,如果是AMD ...

  9. hdu 5224 Tom and paper 水题

    Tom and paper Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/6 ...

  10. 一次经典的tcp三次握手

    TCP报头 在三次握手中使用的字段: 32位序列号 seq:表示的是本次报文发送的数据的第一个字节的序号. 32位确认号:ack  表示期望下一次应该接受到的报文的第一个字节的序号,若ack = N则 ...