查看: 1349| 回复: 4
跳转到指定楼层
上一主题 下一主题
收起左侧

[数组] 请教一道2sum的变种

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
刚面完的某小公司的一道题
Given an array of integers, return the number of pairs, each whose sum is less than or equal to a specific target.

E.g. input [3, 2, 5, 1, 0] and target = 5. The output should be 7.

很明显用两个for loop可解,是O(N^2),但是如果想要O(NlogN)甚至O(N)的话应该怎么做呢?真心求教。。。



补充内容 (2019-1-18 01:44):
大家的回复都很给力,非常感谢!总结一下,首先要排序O(NlogN),然后利用二分O(NlogN),或者头尾双指针O(N)都行。因为排序O(NlogN),所以整体至少O(NlogN)。

评分

参与人数 1大米 +3 收起 理由
大笨熊nyc + 3 欢迎来一亩三分地论坛!

查看全部评分


上一篇:新手转行刷题学习曲线
下一篇:37. Sudoku Solver
推荐
qxt 2019-1-9 15:08:18 | 只看该作者
全局:
先排序, 时间复杂度O(nlogn)
然后利用单调性,检查累加和。两个指针分布指向数组两端。如果最小值+最大值满足小于等于target,那么最小值到最大值之间的所有数都满足<=target;因此可以继续统计次小值。
否则,说明右边数字太大,缩小一下试试。右侧指针永远不需要回到最右侧。两个指针相交之后,结束。因此总体时间复杂度O(n)

arrays.sort(arr);

l=0, r = arr.length-1;
while( l < r ){
   if( arr[l] + arr[r] <= target ) {
         count += r-l;  //例如 [l]=0, [r]=5,  [l]+[r] <= 5, 因此小于r的其他数字与l的累加都小于等于5
         l++; //检查稍大点的小数字
   }
   else{
        r--;
    }
}

=> count


评分

参与人数 1大米 +3 收起 理由
wilqud + 3 很有用的信息!

查看全部评分

回复

使用道具 举报

全局:
我的想法是排序之后,头尾两个指针往中间靠
回复

使用道具 举报

推荐
Airtnp 2019-1-9 09:29:22 | 只看该作者
全局:
排序一遍然后每次二分找index累加 O(nlogn)
Target合理范围 记Count(n=k) 算Count(n <= k) 累加 O(max(N, Target))

评分

参与人数 1大米 +3 收起 理由
wilqud + 3 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
Frimish 2019-1-9 09:24:59 | 只看该作者
全局:
O(nlogn)  sort 一下,利用单调性做;

评分

参与人数 1大米 +3 收起 理由
wilqud + 3 很有用的信息!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表