算法笔记_037:寻找和为定值的两个数(Java)
目录
1 问题描述
输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数。如果有多对数的和等于输入的整数,输出任意一对即可。例如,如果输入数组[1,2,4,5,7,11,15]和整数15,那么由于4+11 = 15,因此输出4和11。
2 解决方案
2.1 排序夹逼法
首先将整数数组,使用合并排序进行从小打到的排序,然后对这个排完序的数组从两头往中间遍历,一旦出现两个数的和等于输入的那个整数,则立即输出这两个数,并结束遍历。
具体代码如下:
- package com.liuzhen.array_2;
- public class TwoSumN {
- /*
- * 参数A:给定的一个从小到大排序的数组
- * 参数n:待求和数n
- * 函数功能:打印出A中两个元素,满足A[i]+A[j] = n
- */
- public void getTwoSumN(int[] A,int n){
- int start = 0;
- int end = A.length - 1;
- while(start < end){
- if(A[start] + A[end] == n){
- System.out.println("\n数组中元素A["+start+"]" +
- " + A["+end+"] = "+n+",A["+start+"] = "+A[start]+",A["+end+"] = "+A[end]);
- break;
- }
- else{
- if(A[start] + A[end] > n)
- end--;
- else
- start++;
- }
- }
- }
- //归并排序
- public void mergeSort(int[] A){
- if(A.length > 1){
- int[] leftA = getHalfArray(A,0); //数组A的左半部分
- int[] rightA = getHalfArray(A,1); //数组A的右半部分
- mergeSort(leftA);
- mergeSort(rightA);
- getMerge(A,leftA,rightA);
- }
- }
- /*
- * 参数A:要进行折半的数组
- * 参数judge:judge == 0表示返回数组A左上半部分,judge != 0表示返回数组A的右半部分
- * 函数功能:把数组按照长度均分为上半部分和下半部分
- */
- public int[] getHalfArray(int[] A,int judge){
- int[] result;
- if(judge == 0){
- result = new int[A.length/2];
- for(int i = 0;i < A.length/2;i++)
- result[i] = A[i];
- }
- else{
- result = new int[A.length - A.length/2];
- for(int i = 0;i < A.length - A.length/2;i++)
- result[i] = A[i+A.length/2];
- }
- return result;
- }
- /*
- *参数A:给定待排序数组
- *参数leftA:数组A的左半部分
- *参数rightA:数组的右半部分
- *函数功能:返回数组A的从小到大排序
- */
- public void getMerge(int[] A,int[] leftA,int[] rightA){
- int i = 0; //用于计算当前遍历leftA的元素个数
- int j = 0; //用于计算当前遍历rightA的元素个数
- int count = 0; //用于计算当前得到按从小到大排序的A的元素个数
- while(i < leftA.length && j < rightA.length){
- if(leftA[i] < rightA[j]){
- A[count++] = leftA[i];
- i++;
- }
- else{
- A[count++] = rightA[j];
- j++;
- }
- }
- if(i < leftA.length){
- while(i < leftA.length)
- A[count++] = leftA[i++];
- }
- if(j < rightA.length){
- while(j < rightA.length)
- A[count++] = rightA[j++];
- }
- }
- public static void main(String[] args){
- TwoSumN test = new TwoSumN();
- int[] A = {2,1,7,4,6,1,2,4,3,6,8,4,2,1,7,3,4,6,8,3,4};
- test.mergeSort(A);
- System.out.println("对数组A进行合并排序后结果:");
- for(int i = 0;i < A.length;i++)
- System.out.print(A[i]+" ");
- test.getTwoSumN(A, 10);
- }
- }
运行结果;
- 对数组A进行合并排序后结果:
- 1 1 1 2 2 2 3 3 3 4 4 4 4 4 6 6 6 7 7 8 8
- 数组中元素A[3] + A[20] = 10,A[3] = 2,A[20] = 8
算法笔记_037:寻找和为定值的两个数(Java)的更多相关文章
- 算法笔记_041:寻找和为定值的多个数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 输入两个整数n和sum,要求从数列1,2,3,...,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题 ...
- 在数组中寻找和为定值的n个数
/*-------------------------------------------------------*/ /*寻找和为定值的两个数 输入一个数组A[0,N-1]和一个数字Sum,在数组中 ...
- 编程之法section II: 2.2 和为定值的两个数
====数组篇==== 2.2 求和为定值的两个数: 题目描述:有n个整数,找出其中满足两数相加为target的两个数(如果有多组满足,只需要找出其中一组),要求时间复杂度尽可能低. 解法一: 思路: ...
- 【Data Structure & Algorithm】在排序数组中查找和为定值的两个数
在排序数组中查找和为定值的两个数 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出 ...
- Java实现寻找和为定值的多个数
1 问题描述 输入两个整数n和sum,要求从数列1,2,3,-,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题是典型的背包问题的应用,即先找出n个数 ...
- 【剑指offer】和为定值的两个数
转载请注明出处:http://blog.csdn.net/ns_code/article/details/24933341 题目描写叙述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的 ...
- 【剑指offer学习】求和为定值的两个数(拓展)
接着上面一篇文章: http://blog.csdn.net/u013476464/article/details/40651451 接下来我们拓展一下题目,如果数组是乱序的,并且规定数组中的元素所有 ...
- 算法笔记_035:寻找最小的k个数(Java)
目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法 1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 ...
- 算法笔记_031:计算中值和选择问题(Java)
目录 1 问题描述 2 解决方案 2.1 计算中值问题 2.2 选择问题 1 问题描述 中值问题是求一个n个数列表中某一数组下标k,它要求该下标元素比列表中的一半元素大,又比另一半元素小,这个中 ...
随机推荐
- PHP 笔记——PDO操作数据库
一.简介 PHP 5.1可使用轻量级的统一接口 PDO(PHP Data Object,PHP数据对象)来访问各种常见的数据库.而使用PDO只需要指定不同的 DSN(数据源名称)即可访问不同的数据 ...
- 主席树+dfs SPOJ BZOJ2588 Count on a tree
这道题我由于智障错误导致一直错. 在树上建主席树,加上lca思想,很简单. #include<bits/stdc++.h> using namespace std; ; struct no ...
- AtCoder Regular Contest 81
链接 C.Make a Rectangle 给出一堆木棍的长度 从中选4根,询问在能围成矩形的情况下,矩形的最大面积 开个map统计一下就行 分正方形和矩形分别统计即可 复杂度$O(n \log n) ...
- [BZOJ5093]图的价值(NTT+第二类Stirling数)
5093: [Lydsy1711月赛]图的价值 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 250 Solved: 130[Submit][Sta ...
- BZOJ 1030 [JSOI2007]文本生成器(AC自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...
- seebug的反爬虫技术初探
1.通过request库无法直接爬取,返回521 >>> import requests >>> req = requests.get('https://www.s ...
- [转]Android:异步处理之AsyncTask的应用(二)
2014-11-07 既然UI老人家都这么忙了,我们这些开发者肯定不能不识趣的去添乱阻塞UI线程什么的,否则UI界面万一停止响应了呢——这不是招骂的节奏么?!所以我们知道用Handler+Th ...
- [转]Intel haxm安装失败问题解决
在安装Intel haxm为安卓模拟器加速时,会遇到提示VT-X未开启问题,问题提示如下图 工具/原料 Intel haxm 安卓模拟器 方法/步骤 1 确认你的处理器是否是Intel的,如果是AMD ...
- hdu 5224 Tom and paper 水题
Tom and paper Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/6 ...
- 一次经典的tcp三次握手
TCP报头 在三次握手中使用的字段: 32位序列号 seq:表示的是本次报文发送的数据的第一个字节的序号. 32位确认号:ack 表示期望下一次应该接受到的报文的第一个字节的序号,若ack = N则 ...