数据结构——算法之(005)(输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字)

本文介绍了一种在已排序的数组中寻找两个数使其和为特定值的算法,采用双指针法实现O(n)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出。 联系邮箱:Mr_chenping@163.com】

题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。

题目分析:

一、既然是排序过了,且是升序,那么最大值在最右边,最小值在左边

二、通过2个指针start、end分别指向数组的头和尾,当start+end大于和时end--,否则start--

算法实现:

#include <stdio.h>

void get_sum_num(int *array, int size, int sum)
{
	int *begin = &array[0];
	int *end = &array[size-1];

	while(begin < end)
	{
		if(*begin + *end > sum)
		{
			end--;
		}
		else if(*begin + *end < sum)
		{
			begin++;
		}
		else
		{
			break;
		}
	}
	printf("[%d] = %d + %d\n", sum, *begin, *end);
}

int main()
{
	int array[]={1, 2, 3, 5, 8, 13};
	get_sum_num(array, 6, 5);	

	return 0;
}



### 使用查找排序算法实现大事记的设计与应用 #### 设计目标 为了高效管理查询历史事件,可以构建一个基于时间戳的大事记系统。该系统允许按时间顺序存储重要事件,并支持快速检索特定日期范围内的记录。 #### 关键技术点 - **数据结构选择**:采用线性表来保存每条记录的时间戳及其描述信息;考虑到后续可能涉及频繁的增删操作以及保持内部元素有序排列的需求,这里推荐使用动态数组或双向链表作为底层容器[^2]。 - **排序机制**:每当新增一条日志时,先将其插入到合适位置以维持整体升序状态。对于已存在的大量静态数据,则可以在初始化阶段执行一次全面整理工作——例如运用快速排序法对所有项目按照发生时刻先后次序重新安排^[1]^。 - **查找优化**:鉴于经过上述处理后的列表天然具备良好的局部性特征(即相邻项间差异较小),因此非常适合引入二分搜索策略来进行精准定位。当用户指定具体年份区间后,程序能够迅速锁定符合条件的目标子集并予以返回^[3]^。 ```c++ #include <vector> using namespace std; struct Event { string description; int timestamp; // Unix 时间戳表示法 }; // 插入新事件的同时维护序列有序性 void insertEvent(vector<Event>& events, const Event& new_event) { auto it = lower_bound(events.begin(), events.end(), new_event.timestamp, [](const Event& e, int ts){return e.timestamp < ts;}); events.insert(it, new_event); } // 对整个集合做初步排序准备 void sortEvents(vector<Event>& events){ stable_sort(events.begin(),events.end(), [](const Event &a,const Event &b)->bool{return a.timestamp<b.timestamp; }); } // 实现高效的二分查找功能 int binarySearch(const vector<Event>& events,int target_timestamp){ size_t low=0,high=events.size()-1,mid; while(low<=high){ mid=(low+high)/2; if(events[mid].timestamp==target_timestamp)return mid; else if(events[mid].timestamp>target_timestamp) high=mid-1; else low=mid+1; } return -1;//未找到匹配项 } ``` 通过以上方法论指导下的编码实践,不仅实现了预期的功能需求,而且有效提升了系统的性能表现,在面对海量数据输入场景下依然能保证较高的响应速度服务质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值