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

编程之美2.12——快速寻找满足条件的两个数或三个数 问题: 1. 快速找出一个数组中的两个数,让这两个数之和等于一个给定的值。 2. 快速找出一个数组中的三个数,让这三个数之和等于一个给定的值。 1. 解法:算法复杂度为O(nlogn)。先用快速排序对数组排序,让后用双指针(双索引)法对排序好的数组进行反向遍历,并且遍历的方向不变。(若是计算两个数的和,则初始化为i=0,j=n-1,若是计算两个数的差,则初始化为i=0,j=1) 之 阅读详情

快速找出一个数组中的两个数字 让这两个数字之和等于一个给定的数字(假设这个数组中肯定存在这样一组或以上的数

方法一:

穷举法:

	for(int i=0;i<n;i++)
	{
		for(int j=i;j<n;j++)
		{
			if (a[i]+a[j]==m)
				cout<<a[i]<<' '<<a[j]<<endl;
		}
	}

算法时间复杂度为O(N*N)


方法二: 假设查找和为M的两个数a,b,查找a后 再查找b=M-a是否在数组中 若数组是无序的查找的时间复杂度为O(N )  我们可以通过将数组排序 提高查找效率  如用二分法 查找时间缩至O(log N) 对于数组中的每个元素都需要花O(logN)的查找时间 所以 总的时间复杂度为O(NlogN) 排序所花的时间也为O(NlogN) 总的时间复杂度仍为O(NlogN)


方法三:

假设数组排序后为a[0],a[1],a[2],...a[N-1], a[0]<a[1]<a[2]<....<a[N-1] 分别从数组两端(i,j)遍历数组 

如果 a[i]+a[j]==给定的数字 ,输出


如果 a[i]+a[j]>给定的数字  ,因为数组按递增排序  a[i]<a[i+1] ,a[j]>a[j-1]  所以 要得到给定的数字 j=j-1


同理 如果a[i]+a[j]<给定的数字  i=i+1


排序的时间复杂度为O(NlogN) 遍历数组的时间复杂度为O(N )

总的时间复杂度为 O(NlogN +N ) =O(NlogN)


#include <iostream>
using namespace std;
int compare(const void *a,const void *b)
{
	return a > b ? 1 : -1;
}
int findk(int A[], int n, int k, int *a, int *b)
{
	if (A == NULL || n<2)
		return -1;
	qsort(A, n,sizeof(int)*(n+1),compare);
	*a = *b = 0;
	int start = 0;
	int end = n;
	if (A[start] + A[end]<k)
		return 0;
	while (start<end)
	{
		if (A[start] + A[end] == k)
		{
			*a = A[start];
			*b = A[end];
			return 0;
		}
		if (A[start] + A[end]>k)
			end--;
		else
			start++;
	}
}
int main()
{
	int A[] = { 1,2,4,7,3,8,9 };
	int n = 7;
	int k;
	cin >> k;
	int a = 0;
	int b = 0;
	if (findk(A,n-1,k,&a,&b) == -1)
		cout << "Not have!";
	else
		cout << a << ' '<<b << endl;
	return 0;
}



==========================

输入一个正数s 打印出所有和为s的连续正数序列(至少含有两个数)

例如输入15 由于1+2+3+4+5=4+5+6=7+8=15 所以结果打印出三个连续序列1-5 4-6 和7-8


思路:

假设small和big分别表示序列的最大值和最小值

small 初始化 为1 big初始化为2

如果small到big的序列和大于s 则从序列中去掉较小的值 即增大small

如果small到big的序列和小于s 则增大big 让序列包含更多地数字

因为这个序列至少要有两个数字 一直增加到(1+n)/2为止



#include <iostream>
using namespace std;
int a = 0;
int b = 0;
void print(int a,int b)
{
	for (int i = a;i <=b;i++)
	{
			cout << i<< ' ';
	}
	cout << endl;
}

int main()
{
	int n;
	cin >> n;
	if (n <= 2)
	{
		cout << "NO~!";
		return 0;
	}
	int end = (1 + n) / 2;
	int small = 1;
	int big = 2;
	int t = big + small;
	while (big <= end)
	{
		if (t == n)
			print(small,big);
		if (t > n)
		{
			t -= small;
			small++;
		}
		else
		{
			big = big + 1;
			t += big;
		}
	}
	return 0;
}





02-基于ART-PI开发板创建USB CDC 虚拟串口设备 本例在ART-PI开发板上,基于RT-Thread 5.0,5虚拟了一个USB32 CDC串口设备。 阅读详情

相关推荐

AD2428与SigmaStudio:从节点自动配置与EEPROM存储实战

本文详细介绍了AD2428 A2B收发器与SigmaStudio开发环境的集成应用,重点讲解从节点自动配置与EEPROM存储的实战流程。通过硬件连接、属性配置、数据导出及嵌入式系统集成等步骤,实现设备上电自启动,提升汽车音频系统的可靠性与部署效率。

g8f9d0s1a2的博客 650

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

快速寻找一个数组中的两个数,让这两个数之和等于一个给定的值。这里假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 解法 1 使用穷举的方法,就是用两个for循环进行穷举。 nums = [2,7,11,15] target = 9 def TwoSum(nums,target): n = len(nums) for i in range(n): for j in range(i,n): if nums[i] + num

qq_43211230的博客 1409

模拟IC设计避坑:手把手教你用Cadence仿真恒定跨导轨到轨运放(附完整工艺库文件)

本文详细解析了使用Cadence仿真恒定跨导轨到轨运放的全流程,涵盖电路原理、工艺库配置、尺寸设计及仿真分析。通过1:3电流镜补偿技术实现跨导稳定,提供CSMC 0.25um工艺下的实战案例,帮助工程师规避设计陷阱,提升模拟IC设计效率。

weixin_30952535的博客 494

程序员面试100题之十:快速寻找满足条件的两个数

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解。但是要得出高效率的解法,还是需要一番思考的。 解法一 一个直...

yuanlanjun 1675

基于DSP28335的Matlab/Simulink代码生成实验七:A/D采样

实验七:讲解如何使用DSP的ADC模块,通过代码生成技术控制DSP进行电流采样,是后续实现电机闭环控制的重要环节。通过简单的实验来熟悉代码生成的过程。最终实现复杂算法代码自动生成,进行高性能电机控制!

m0_73869369的博客 4724

CloudCompare 二次开发:插件中的 PCL 环境配置与编程

在进行 CloudCompare 的二次开发过程中,我们常常需要使用点云库(Point Cloud Library,简称 PCL)来处理和分析点云数据。在 CloudCompare 的界面中,选中一个点云对象,然后点击菜单栏中的 “插件” -> “MyPluginAction”。插件将对选中的点云对象进行体素滤波处理,并更新显示结果。下面我们将展示一个简单的插件编程示例,该示例使用 PCL 对输入的点云数据进行体素滤波处理。方法进行体素滤波处理,并将结果点云赋值给选中的点云对象。文件并点击 “打开”。

2301_79331387的博客 283

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

快速找出一个数组中的两个数,让此两个数之和等于一个给定的数。 如:5 6 1 4 7 9 8 中找出两个数之和等于10的数 编程之美之美P177有详细解答过程,思路是先排序(O(nlog(n)),然后保存两个指针beg、end,初始指向头部和尾部,如过*beg+*end==sum,则返回;如果*beg+*end>sum则向前移动end;*beg+*end 扩展问题: 1、快速找出一个数组中

hysfwjr的专栏 921

系统架构设计师【第1章】: 绪论 (核心总结)

系统架构 (System Architecture)是系统的一种整体的高层次的结构表示,是系统的骨架和根基,也决定了系统的健壮性和生命周期的长短。系统架构设计师是承担系统架构设计的核心角色,他不仅是连接用户需求和系统进一步设计与实现的桥梁,也是系统开发早期阶段质量保证的关键角色。通俗地说,系统架构 (System Architecture)

数据知道的博客 1万+

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

<br />题目的大概意思是:快速找出在一个数组内的两个数,让这两个数之和等于一个给定的值。书中给出的解法三觉得应该是(NlogN)复杂度中比较快的,但这种解法为什么完备还要仔细推导一下才知道。因为是找两个数之和,解法二还可以再优化。排序后可以把数组分成两段,以和的一半作为分割点,这样就在二分查找时只需找出前半部分的Sum-arr[i]是否在后半部分中。我用SLT的binary_search实现了一下,但是此法由于排序,只能返回具体的解,如果返回解在原数组中的位置,那要复杂得多。<br />//给定条件为S

林榆耿的专栏 1733

[Dify实战] 多轮对话状态管理:上下文保持与槽位填充

本文探讨了基于LLM的对话应用中多轮对话状态管理的核心挑战与解决方案。文章指出,单纯的"能聊"远远不够,关键在于建立有效的状态管理机制,包括上下文保持和槽位填充两大核心能力。通过Dify实战视角,详细阐述了如何设计工程化落地方案:采用混合策略的上下文管理(窗口+摘要+关键槽位)、JSON Schema强约束的槽位抽取、统一状态对象存储、冲突处理机制和优化追问策略。文章特别强调,合理的状态管理能将"聊天"转化为"可执行的业务流程",避免模型成为&qu

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 237

C#联合Halcon机器视觉框架源码—升级版

相较于之前的NxtVision,本软件代码架构更加合理,且新增。对源码有需求的,订阅本专栏后,私信我领取。、原来的vb脚本改为。

Z's Palace 1415

编程练习-快速寻找满足条件的两个数

题目-来自编程之美 给定一个数组,快速从其中找出两个数满足其之和等于给定的数,这里假设其中至少存在一组符合要求的解; 分析 这里的关键在于快速 最为愚钝的方式当然是:穷举,从数组中任意取出两个数字进行判断,但是时间复杂度为$O(N^2)$; 一般是数组,首先进行排序,采用时间复杂度为$O(Nlog_2N)$, 然后通过一次遍历求出所需的解,时间复杂度为$O(N)$, 所以整个时间复杂度为$O...

weixin_30674525的博客 211

SLAM Cartographer(18)后端优化问题求解器

了解经过闭环检测构建了子图与节点之间的约束之后,通过后端优化求解器进行优化求解。核心是基于Ceres库进行SPA(Sparse Pose Adjustment)的优化方法,把后端优化问题描述成为一个最小二乘的问题求解

氢键H-H 5680

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

问题: 1. 快速找出一个数组中的两个数,让这两个数之和等于一个给定的值。 2. 快速找出一个数组中的三个数,让这三个数之和等于一个给定的值。 1. 解法:算法复杂度为O(nlogn)。先用快速排序对数组排序,让后用双指针(双索引)法对排序好的数组进行反向遍历,并且遍历的方向不变。(若是计算两个数的和,则初始化为i=0,j=n-1,若是计算两个数的差,则初始化为i=0,j=1) 之

唛哩唛哩轰 713

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

在《编程之美》一书的第2.12个题目描述如下: 能否快速找出一个数组中的两个数字,让这个两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定至少存在一组满足要求的解。 作者给出了3种方案: [方案一]穷举法:从数组任意取出两个数字,计算两者之和是否为给定的数字。时间复杂度O(N^2),效率较低。 [方案二]将问题变通为一个查找问题:求两个数之和,假定为sum。对于数组中的每个

andyliuxs的专栏 1563

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

编程之美——快速寻找满足条件的两个数或三个数 问题: 1. 快速找出一个数组中的两个数,让这两个数之和等于一个给定的值。 2. 快速找出一个数组中的三个数,让这三个数之和等于一个给定的值。 1. 解法:算法复杂度为O(nlogn)。先用快速排序对数组排序,让后用双指针(双索引)法对排序好的数组进行反向遍历,并且遍历的方向不变。(若是计算两个数的和,则初始化为

chenglinhust的专栏 1119
上一篇: 求数组的字数组之和的最大值
下一篇: 寻找数组中的最大值和最小值
Fivesplus
博客等级 码龄12年 1粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值