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

yangykaifa yangykaifa     2022-08-28     488

关键词:

      这道题目的意思是,在一个数组中寻找两个数。使这两个数的和等于给定的数(找到随意一组就能够了)。

      题目读完之后,感觉这道题目还是非常easy的。就是遍历数组呗,走两遍,即能够在O(n2)时间复杂度内解决问题。

只是,细致想想之后。复杂度还是能够减少的。

      首先,我们能够对数组进行排序,这样,得到的数组就是一个有序数组(如果数组是递增的)。那么,我们能够利用两个指针。一个指针指向数组的第一个元素,一个指针指向数组的最后一个元素。所以,就是两个指针分别指向两个最值。然后前后每次移动一个指针就能够尝试的去寻找所须要的一组数。

      比方。初始时,两个指针指向的值相加之后,和大于给定的数字,那么。就须要把“最大值指针”向前移动,这样,就会使得两个指针指向的值的和变小;如果两个指针指向的值相加小于给定的数字,那么。就须要把“最小值指针”向后移动。这样,就会使得两个指针指向的值的和变大了。然后,终止条件是两个指针不能相等或者“最小值指针”等于“最大值指针”。

      有了上述思想。能够得到例如以下的解决的方法:

      函数声明:

/*2.12 高速寻找满足条件的两个数*/
void DutQuickFindSpecifyTwoNums(int*, int, int, int&, int&);

      源码:

/*高速寻找两个值*/
bool _DutQuickFindSpecifyTwoNums = false;
void DutQuickFindSpecifyTwoNums(int* A, int size, int sum, int& one, int& two)
{
	if (!A || size <= 1)
	{
		one = -1;
		two = -1;

		return;
	}

	std :: sort(A, A + size);

	int i = 0;
	int j = size - 1;

	/*即前后各一个指针。然后两个指针往中间方向走,比对遇到的值*/
	while (i < j)
	{
		if (A[i] + A[j] == sum)
		{
			one = A[i];
			two = A[j];

			return;
		}
		else if (A[i] + A[j] > sum)
			--j;
		else
			++i;
	}

	one = -1;
	two = -1;

	return;
}


编程之美-1的个数

1的数目题目:给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现所有“1”的个数。例如:N=2,写下1~2。这样只出现了1个“1”。N=12,我们会写下1,2,3,4,5,6,7,8,9,10,11,12,这样,1的个数是5。问题是:1.写一... 查看详情

编程之美_集合

时间限制:12000ms单点时限:6000ms内存限制:256MB描写叙述统计满足下列条件的集合对(A,B)的数量:A,B都是{1,2,…,N}的子集;A,B没有公共的元素;f(A)<=f(B)。f(S)定义为S中全部元素的按位异或和。比如, f({})=0,f({1,3})=2。由于答案可... 查看详情

《编程之美》——寻找发帖“水王”学习与扩展

问题描述(难度*):传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的I... 查看详情

编程之美初赛第一场

题目3:活动中心时间限制:12000ms单点时限:6000ms内存限制:256MB描写叙述A市是一个高度规划的城市。可是科技高端发达的地方,居民们也不能忘记运动和锻炼,因此城市规划局在设计A市的时候也要考虑为居民们建造一个活动中心。... 查看详情

编程之美之2.5寻找最大的k个数

【题目】有很多无序的数,从中找出最大的K个数。假定他们都不相等。【解法一】如果数据不是很多,例如在几千个左右,我们可以排一下序,从中找出最大的K个数。排序可以选择快速排序或者堆排序[cpp] viewpla... 查看详情

编程while循环如果有两个不同条件该怎样设置?

即while(条件1)且(条件2),条件1一开始就有,但条件2想要再循环3次后才开始判断,这种情况该怎样处理?用&&或者||来结合判断。如果两个条件要同时满足,就用&&,当两个条件同时满足的时候才能满足条件。如果两个条件... 查看详情

1.13.14

14:求满足条件的3位数描述编写程序,按从小到大的顺序寻找同时符合条件1和2的所有3位数,条件为:1.该数为完全平方数2.该数至少有2位数字相同例如,100同时满足上面两个条件。输入输入一个数n,n的大小不超过实际满足条件... 查看详情

寻找完美平方数(代码片段)

/*实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等*/步骤一:怎样找到完全平方数步骤二:判断是否有两个数相同(双层判断)对于此题,我浪费的时间在怎样判断一个数... 查看详情

1777:寻找整数(代码片段)

1777:寻找整数时间限制:1000ms        内存限制:262144KB【题目描述】给定整数m,k,求出正整数n使得n+1,n+2,…,2n中恰好有m个数在二进制下恰好有k个1。有多组数据。【输入】第一行一个整数t表示数据... 查看详情

洛谷[p1402]酒店之王

...回忆一下二分图匹配的匈牙利算法的具体流程,它是通过寻找增广路来判断最大匹配数的,我们再观察一下题目中的两个条件,只有两个条件都满足,才算找到一条增广路,所以我们可以分别寻找判断两个条件。即对两个二分图... 查看详情

matlab中find()寻找函数的常见用法(代码片段)

Matlab中find函数的使用简言之:输入为:寻找的对象和条件 (在哪里找和找什么);输出为:满足条件的数的位置。当没有寻找到满足条件的值时,返回空矩阵;例如在某向量/矩阵中寻找为零的数,寻找不为零的数,寻找某一... 查看详情

编程之美学习笔记2.1求二进制数中1的个数

问题:对于一个字节(8bit)的无符号整型变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高。解法一:除、余操作我们知道,对于二进制操作,除以一个2,原来的数字将会减少一个0,如果除的过程中有... 查看详情

创建一个新列,它是满足两个条件的多个其他列中的日期数之和(代码片段)

我有一个类似于此的数据框(除了Visit和Deliv列的数量上升到Visit_84和Deliv84,并且有几百个客户端-我在这里简化了它)ClientVisit_1Visit_2Visit_3Deliv_1Deliv_2Deliv_3Key_DTClient_12018-01-012018-01-202018-02-10NoYesYes2018-01-15Client_22018-01-10201 查看详情

编程之法sectionii:2.2和为定值的两个数(代码片段)

====数组篇====2.2求和为定值的两个数:题目描述:有n个整数,找出其中满足两数相加为target的两个数(如果有多组满足,只需要找出其中一组),要求时间复杂度尽可能低。解法一:思路:开散列映射,空间换时间,查找耗时o(n)W... 查看详情

编程之美——2.7求最大公约数

/***本程序用于求解两个正整数的最大公约数*求解最大公约数往往可以用的有三种方法:*eg:求正整数x和y的公约数*1.遍历,从1遍历到min(x,y)为止,找到能够同时被两数整除的最大整数*2.辗转相除法,取k=x/y,b=x%y,则x=k*y+b;如果一个数能同... 查看详情

2014微软编程之美初赛第一场第三题活动中心

活动中心时间限制:12000ms单点时限:6000ms内存限制:256MB描写叙述A市是一个高度规划的城市,可是科技高端发达的地方,居民们也不能忘记运动和锻炼,因此城市规划局在设计A市的时候也要考虑为居民们建造一个活动中心,方便居... 查看详情

编程之美学习笔记2.2不要被阶乘吓到

我好饿吖,为什么我现在在教室闻到了饭香味。。。问题1.给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N=3628800,N!的末尾有两个0。(好巧吖,昨天做的51nod1003就是这个题,来分析一下吧!)看到这题,你想完... 查看详情

寻找道路

题目描述在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:1.路径上的所有点的出边所指向的点都直接或间接与终点连通。2.在满足条件1的情况下使路径最... 查看详情