Two Point I (简单的二分应用)

题目描述

有两个从小到大排好序的序号a和b,长度均为n。
要求选择两个数i、j,满足a[i]+b[j]<=m的情况令a[i]+b[j]尽可能大。输出a[i]+b[j]的最大值

 

输入

输入一个正整数n、m,表示数组的长度、m如上面题面所说 。
第2行输入a数组。
第3行输入b数组。

 

输出

输出答案。

 

样例输入

复制样例数据

4 10
1 3 5 9
2 8 9 10

样例输出

10

提示

100%的数据满足:1 ≤ n ≤ 1,000,000.
所有数保证大小∈[1,1000000000].

 题干含有如下关键条件:

  1.  两个数组都是有序的。
  2. 从a[i]中选择一个数,再从b[j]中选择一个数。
  3. m内尽可能大。
  4. 两个数组的长度最大为1e6。

用最朴素的算法就是对于每一个a[i],都要遍历一遍b[i]来判断一下a[i]+b[j]与m的关系。是O(n^2)的复杂度,极限数据为复杂度为1e12,显然大量超时。

根据题目中有序的条件,我们可以把某一个循环优化为二分查找,这样极限复杂度被降为了1e6*log2(1e6),在1.8e7~2.4e7之间。满足了时间复杂度的限制。

当然还可以更多的优化一下:如果我们得到的答案已经是m,那么接下来的遍历就是徒劳了&#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值