题目-来自编程之美
给定一个数组,快速从其中找出两个数满足其之和等于给定的数,这里假设其中至少存在一组符合要求的解;
分析
这里的关键在于快速
- 最为愚钝的方式当然是:穷举,从数组中任意取出两个数字进行判断,但是时间复杂度为$O(N^2)$;
- 一般是数组,首先进行排序,采用时间复杂度为$O(Nlog_2N)$, 然后通过一次遍历求出所需的解,时间复杂度为$O(N)$, 所以整个时间复杂度为$O(Nlog_2N)$,
- 书中分析: 令
i = 0, j = n - 1
, 查看arr[i] + arr[j]是否等于sum
,如果是则结束,否则判断大小,如果小于sum,则i++
,否则j--
, 这样从两端向中间移动,则一定会找到的。 - 同时我借助快排思想中移动,上面每次只移动一个位置,能不能一次移动多个,这样在两个目标数距离比较近时,能过更加快速的找到。详见代码!事实证明可行!
- 书中分析: 令
实现(java)
1 | package com.jiajia.find; |
最后
此致,敬礼!