引用
【面试】快速寻找满足条件(两个数的和为指定值)的两个数
题目:
能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。
解法:
思路1:
暴力穷举O(n^2)
思路2:
对数组预排序O(NlogN),然后遍历该数组,对每一个数a,都进行查找Sum-a在不在数组中。这种查找在二分查找下需要O(logN),所以综上效率为O(NlogN)+O(N)*O(logN)=O(NlogN).
思路3:
如果在一定的限制条件下,比如说1,数字均为int型,2,此中int型数的范围有一定限制。则可以考虑用hash来获得O(1)的查找效率。方法,首先遍历一遍数组,初始化hash表O(N),然后再次遍历数组,对每一个数字a进行查找SUm-a只需O(1),所以总的效率为:O(N)+O(N)*O(1)=O(N).
思路4:
首先预排序O(NlogN).然后在一个循环体里使用两个循环变量进行反向遍历,并且这两个变量遍历的方向是不变的,从而保证遍历算法的时间复杂度为O(n)。即令i = 0,j = N-1,这样a[i]+a[j]正好是一个中间数,如果想减小sum的值,就一直缩小j,如果想增加sum的值,就增加i。刚开始一直无法理解这样子一定可以找到这个和么?难道不会漏掉了解得位置。可以这么理解,假如排好序后的数组为1,3,6,a,9,12,17,28,b,35,46 ,那么i最初指向1的位置,j最初指向46的位置,比如所求的是Sum=a+b,a<b,ab在其中数组中某位置上。那么i和j在变化过程中,只考虑i遇到了a或者j遇到了b的时候,必定有一个先遇到,比如i遇到了a,那么这个时候j必定还没指到b,故这是j指到的比b大,从而j减小直到b位置。同理若j先指到了b位置,那么i必定还没指到a(这是我们的前提),然后i现在指到的比a小,故,i增加,直到a位置。
分享到:
相关推荐
如果差值大于4,那么序列无法形成连续,因为整数范围是0到65535,相邻两个数的最大差值是4。题目要求时间复杂度不能超过O(n^2),所给的解法使用了线性时间复杂度O(n)。 2. **二叉树最近公共祖先查找** 在这个...
题目提供的两种解法中,`func()` 使用了两个列表来分别存储不重复元素和已删除元素,而`func2()` 利用了集合(set)的特性快速去重并计算元素之和。集合在Python中是一种无序且不允许重复的数据结构,适用于快速查找...
#### 题目一:寻找两个数之和等于指定值 **题目描述**:给定一个已排序的整数数组 `$a` 和一个目标值 `$sum`,找出数组中和为目标值的两个数,并打印这两个数。 **解题思路**: 1. **双指针法**:设置两个指针,一...
在设计DNS服务器的cache数据结构时,需要考虑如何快速插入和查询IP数据,这通常涉及到数据结构的选择,如哈希表、平衡树等,以满足高并发和快速查找的要求。 找出数组中出现次数超过一半的数,可以使用摩尔投票算法...
具体来说,外层while循环控制整个过程的迭代次数,内层的for循环则用于寻找满足特定条件(即i%10==0)的数字。在找到这样的数字后,通过break语句跳出内层循环,然后更新变量i和a。最终,程序将输出变量a的值,即32...
提供了一个嵌套循环的例子,寻找满足特定条件的数字组合。这个题目展示了多重循环的使用,以及如何通过条件判断来排除不满足条件的组合。这涉及到 Python 的基本逻辑运算符和范围操作。 4. 装饰器: 装饰器是 ...
10. **第 N 个泰波那契数**:递归算法是解决泰波那契序列的经典方法,通过调用自身计算前两个数的和来获取下一个数。 11. **二叉搜索树结点最小距离**:递归地访问树的节点,记录最近邻节点的距离,可以找到最小...
- **Cross Join**(笛卡尔积):当两个表进行连接时,如果没有指定任何条件,会返回所有可能的行组合,结果的行数等于第一个表的行数乘以第二个表的行数。 - **Inner Join**:只返回两个表中匹配的行,即满足连接...
这段代码定义了一个主函数 `test()`,它遍历1到100000之间的所有数,并使用三个辅助函数 `test1()`、`test2()` 和 `test3()` 来判断该数是否满足条件。这三个函数分别检查数能否被7整除、各位数字之和能否被7整除...
由于浮点数的精度问题,通常通过比较两个数的差值是否小于某个阈值来判断。 #### GPIO模拟串口TX和RX、C语言中的可变参数函数 - **GPIO模拟串口**:利用通用输入输出接口模拟串行通信。 - **可变参数函数**:使用 `...
- 将所有指定的字符或数字替换后,找出某一行或列的和是否满足特定条件。 - 对矩阵的行或列进行反转操作后,寻找特定位置上的元素。 - 在矩阵中执行特定的运算,如交换某些位置上的元素,然后根据结果找出特定的答案...
在这个例子中,`decorator_a` 和 `decorator_b` 是两个装饰器,它们分别创建了内部函数 `inner_a` 和 `inner_b`。当调用 `f(1)` 时,按照装饰器的堆叠顺序,首先执行 `decorator_b`,然后是 `decorator_a`,最后执行...
`concat()`连接两个或更多数组;`forEach()`对每个元素执行回调函数;`map()`创建新数组,每个元素是原数组元素经过回调函数处理后的结果;`fill()`用特定值填充数组;`includes()`检查数组中是否存在指定元素;`...
1. 执行两次 `rand7()` 函数,得到两个数 `a1` 和 `a2`。 2. 计算 `a1 * 7 + a2`,因为 `a1` 和 `a2` 的范围都是 [0, 6],因此 `a1 * 7 + a2` 的范围是 [0, 48]。 3. 当结果小于40时,将其除以10得到的结果加1作为 `...
- **连接**:根据指定的条件组合两个关系的元组。 #### 3.7 关系代数例题 例如,给定两个关系 R(A, B) 和 S(B, C),其中 A、B、C 表示属性名。使用关系代数表达式来表示以下操作: - **R 与 S 的自然连接**:表示...
分支定界法是一种搜索算法,它按照广度优先搜索的方法,在解空间中搜索满足条件的解。 搜索算法 搜索算法是计算机视觉中的一种重要算法,常见的搜索算法有:完全搜索、广度优先搜索、指定界搜索、定向搜索、最优...
- 功能:计算指定范围内满足条件的元素数量。 - 示例:`std::count(begin(v), end(v), value);` 4. **遍历(For_Each)**: - 功能:对指定范围内的每个元素执行操作。 - 示例:`std::for_each(begin(v), end(v...
解决策略是先对集合进行排序,然后使用两个指针j和k从两端向中间扫描,找到满足条件的A和B。 3. **排序二叉树搜索**: 给定一种特殊的二叉树结构,要求实现一个搜索函数。由于二叉树是排序的,可以使用递归的中序...
- **描述**:求两个数的最大值或最小值。 - **知识点**: - 数学运算:加法、减法等基本算术操作。 - 条件判断:使用 `if` 语句比较两个数的大小。 7. **字符串统计(String Statistics)** - **描述**:统计...