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

题目:一个数组,快速找出两个数的和,使得这个和等于给定的另外一个数

思路:先排序,然后首尾两个指针,i.j,如果和等于给定的数,则找到,如果小于的话,则I++,如果大于的话,则J--

代码:

#include <iostream>
#include <algorithm>

#define MAXN 10000

using namespace std;

int n, sum;
int a[MAXN];

int main() {
	cin >> n >> sum;
	for(int i = 0; i < n; ++i) cin >> a[i];
	sort(a, a+n);
	for(int i = 0, j = n-1; i < j; ) {
		if(a[i] + a[j] == sum) {
			cout << a[i] << endl << a[j] << endl;
			break;
		}else if(a[i] + a[j] < sum) i++;
		else j--;
	}
	return 0;
}
时间: 2024-08-13 02:56:24

2.12 快速寻找满足条件的两个数的相关文章

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

给一个数组,找出其中一对和为sum的数字. 由于已经做过排好序的数组,找和为sum的题目.所以完全没有过多考虑就排了序,左右指针相互收缩着寻找. 跟答案上的方法也是一样的. /* start time = 16:57 end time = 17:15 */ #include <iostream> #include <stdlib.h> using namespace std; //由小到大排 int cmp(const void * a, const void * b) { ret

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

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

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

快速寻找满足条件的两个数 问题描述 能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字,为了简化起见,我们假设这个数组中肯定存在这样一组或以上符合要求的解. 分析与解法 [解法一] 代码如下: 1 package chapter2shuzizhimei.findtwonumber; 2 /** 3 * 快速寻找满足条件的两个数 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class FindTowNumber1 { 9 //定义一个

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

时间:2014.07.17 地点:基地 ------------------------------------------------------------------------------------- 一.问题描述 给定一个数组,要求快速查找出其中的两个值,他们的和为一个给定的值. 比如给定数组:1 4 5 6 8  9,和给定值9,我们能找出4+5=9为所要的数值 ------------------------------------------------------------

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

  这道题目的意思是,在一个数组中寻找两个数.使这两个数的和等于给定的数(找到随意一组就能够了).       题目读完之后,感觉这道题目还是非常easy的.就是遍历数组呗,走两遍,即能够在O(n2)时间复杂度内解决问题. 只是,细致想想之后.复杂度还是能够减少的.       首先,我们能够对数组进行排序,这样,得到的数组就是一个有序数组(如果数组是递增的).那么,我们能够利用两个指针.一个指针指向数组的第一个元素,一个指针指向数组的最后一个元素.所以,就是两个指针分别指向两个最值.然后前后每

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

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 分析与解法 方法一:枚举 从数组中任取两个数字,判断是否满足条件. 显然时间复杂度为N(N-1)/2,即O(N2). 方法二:查找 我们可以把问题进行转化:对于任意数arr[i],查找sum-arr[i]是否在数组中. (1) 一般查找 在不做处理的情况下直接在数组中查找sum-arr[i]的时间复杂度为O(N),总时间复杂度仍为O(N2). (2) 折半查找 显然

数字之魅:快速寻找满足条件的两个数

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字,为了简化起见,我们假设数数组中肯定存在这样一组以上符合要求. 这个题目看起来其实并不难,但是仔细想想还是有许多值得思考的地方. 方案一:常人常规蛮力法.穷举法,需要找数据我们就挨个找,总是能找出来,就是时间问题,我么一次列举每一个数和后一个数的和看是否与目标值相等.但是其时间复杂度为O(N*N). 方案二:由于是查找,我们就可以对其进行排序操作,先排序再查找.为什么要排序呢?这里可以将问题转化一下?既然是寻找和为Sum的两个数

求数组中和为给定值的任意两个数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/24933341     题目: 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出任意一对即可. 例如输入数组1.2.4.7.11.15和数字15.由于4+11=15,因此输出4和11.     思路: 最直接的做法是暴力法,两个for循环,时间复杂度为O(n*n),但是这样没有充

和为定值的两个数

题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输入: 每个测试案例包括两行: 第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和.其中1 <= n <= 10^6,k为int 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出两个数,小的先输出.如果找不到,则输出“-1 -1” 样例输入: 6 15 1 2 4 7 11 15 样例输出: 4 11     思