给定一个整数sum,从n个有序的元素的数组中寻找a,b,使得a+b的结果最接近sum,最快的时间复杂度?
之前遇到的一道算法题,这里记录一下。
算法思想:因为是有序的,所以我们用s存放第一个元素的下标,用e存放最后一个元素的下标,那么arr[s] 就是所有元素中最小的,arr[e]就是所有元素中最大的,所以我们判断arr[s] + arr[e] - sum的值是否大于0,如果大于0那就说明 arr[e] 太大了,那么就e--。如果小于0,arr[s] 太小了,那就s++。这个时候判断是否距离比上一个我们记录的距离更小,更小的话就更新,距离是|arr[s] + arr[e] - sum|这么算出来的。
因为没在oj或者LeetCode上找到,因此我也不确定代码有没有特殊值遗漏,不过大致思想是这样子的。程序能满足题目的要求
代码如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr[10000];
int n,sum;
scanf("%d %d",&n,&sum);
for(int i=0;i<n;i++) {
scanf("%d",&arr[i]);
}
int s=0,e=n-1;
int dis = abs(arr[n-1] + arr[0] - sum);
int result = dis;
int resa,resb;
int flag = 0;
while(s<e){
dis = arr[s] + arr[e] - sum;
if(dis>0){
if(abs(dis)<result) {
result = abs(dis);
resa = arr[s];
resb = arr[e];
}
e--;
}else if(dis<0){
if(abs(dis)<result) {
result = abs(dis);
resa = arr[s];
resb = arr[e];
}
s++;
}else {
printf("%d %d",arr[s],arr[e]);
flag = 1;
break;
}
}
if(flag==0) {
printf("%d %d",resa,resb);
}
return 0;
}
因为是从头和尾同时开始往中间走,他俩汇合即得到答案,故时间复杂度为O(n)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!