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

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

这个题目看起来其实并不难,但是仔细想想还是有许多值得思考的地方。

方案一:常人常规蛮力法。穷举法,需要找数据我们就挨个找,总是能找出来,就是时间问题,我么一次列举每一个数和后一个数的和看是否与目标值相等。但是其时间复杂度为O(N*N)。

方案二:由于是查找,我们就可以对其进行排序操作,先排序再查找。为什么要排序呢?这里可以将问题转化一下?既然是寻找和为Sum的两个数,那么我们就可以查找Sum-arr[i]是否在数组中,在排序后我们就可以使用我们非常熟练的二分查找算法,这样查找一个数据的时间复杂度就降低到了O(logN),但是需要对每一个元素都需要查找,所示其实时间复杂度为O(N*logN)。另外对数据进行排序,我们可以知道其时间复杂度为O(N*logN),综合其时间复杂度为:O(N*logN)。

方案三:时间换空间的方法。我们采用一个hash表将所有的数据映射到表中,然后Sum-arr[i]只需要O(N)的时间久可以了,这样的话,其时间复杂度就被我们降低到了O(N)+O(N)的辅助空间。

方案四:基于求一个整数的所有连续的有序序列的启发,我们可以先对数组进行排序,时间复杂度为O(N*logN),然后对于给定的Sum,i=0,j=N-1,我们首先看arr[i]+arr[j]是否等于Sum,如果小于则i++;否则j--,这样在O(N)的时间复杂度就可以完成。综合总的时间复杂度为:O(N*logN)。

方案四实现代码:

void Find(int *arr,int *data1,int *data2,int lenght,int Sum)
{
	int i,j;
	for(i=0;j<lenght;i<j)
	{
		if(Sum==arr[i]+arr[j])//找到了;
		{
			*data1=arr[i];//记住这两个数;
			*data2=arr[j];
		}
		else if(arr[i]+arr[j]<Sum)
			i++;
		else
			j--;
	}
}

时间: 2024-11-03 11:37:51

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

第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为所要的数值 ------------------------------------------------------------

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

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

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;

【编程之美】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.12 高速寻找满足条件的两个数

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

数字之魅:寻找数组中的最大值和最小值

数组是最简单的一种数据结构.我们经常碰到的一个基本问题,就是寻找整个数组中最大的数,或者最小的数.这时,我们都会扫描一遍数组,把最大(最小)的数找出来.如果我们需要同时找出最大和最小的数呢? 对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢? 这个题目比价简单,主要方案如下: 方案一:分别求最大和最小值.这是一种比较常规的解法.可以分别求出数组的最大值和最小值,这样,我们可以采用最基本的冒泡思想遍历两次(2N)就能求解. 方案二:分组求解.由于前面的需要遍历2N次.这里为

数字之魅:寻找二维平面上的最近的点对

在二维平面上的n个点中,如何快速的找出最近的一对点,就是最近点对问题. 初看这个题,可能感觉有点儿复杂. 方案一:蛮力法.数组中总共包含N个数,所以我们可以把平面内所有的点按X轴排序,然后依次算出后一个坐标与前面所有左边的距离,然后用Min和position来记录最近的距离和两个坐标.该方案和在一维空间求两个最近点的距离有点儿类似,其时间复杂度为:O(N*N). 方案二:在一维空间里,我们知道如果数组有序,我们可以很快找出最近的两个点.我们可以用O(N*logN)的时间复杂度来对数据进行排序[快