从上篇文章我们可以看出寻找两个数和为指定值的较好解法是:
先把数组排序,i = 0,j = N-1,这样a[i]+a[j]正好是一个中间数,如果想减小sum的值,就一直缩小j,如果想增加sum的值,就增加i。
设上面的问题算法为getSumNum(int[] a,int sum),arr为数组,sum为和
扩展问题是:如果寻找三个数字或是任意数字呢?
三个数字的想法:
首先还是数组排序,然后从i=0到n-1进行遍历,遍历a[i]时,在剩下getSumNum(arr',sum-a[i])即可。
任意m个数字的想法:
首先数组排序,然后从i=0到n-1个元素遍历,遍历a[i]时,在剩下的n-1个元素中调用getSumNum(a',sum-a[i]),此时为求m-1个元素和为sum-a[i];接下来,同样的方法,从j=0到n-2个元素遍历,遍历a[j]时在arr'上递归调用getSumNum(a'',sum-a[i]-a[j]),此时为求m-2个元素和为sum-a[i]-a[j];依次递归,知道为求2个元素和为sum-?-?-?...时为止。
不论是求3个数字还好是m个数字,总是能比较穷举法少一个数量级n,比先排序然后二分查找求sum-a[i]也要快。
分享到:
相关推荐
这个问题的常见解法是使用双指针法,首先对数组进行排序,然后遍历排序后的数组,对于每个元素,使用两个指针分别从当前元素的下一个元素和数组尾部开始,向中间移动,寻找满足条件的三数组合。 #### 步骤1:排序 ...
给定一个整数数组`nums`和一个目标值`target`,请你找出数组中和为目标值的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 **基础解决方案:** 最...
在这个“公司面试操作题”中,要求使用Web服务来实现两个整数的求和功能,这涉及到的主要知识点有: 1. **Web服务基础**: Web服务是通过HTTP协议传输数据的,它使用XML(可扩展标记语言)作为数据交换格式,使得...
- 例如,两个两输入与非门可构造出与门、或门和非门;同样,两个两输入或非门也能实现这些功能。 6. **多路复用器(MUX)**: - MUX可用于构建各种逻辑门,如非门、与门、或门、与非门、或非门和异或门。例如,2:...
给定两个有序整数数组`nums1`和`nums2`,其长度分别为`m`和`n`,目标是将这两个有序数组合并成一个新的有序数组,并存储在`nums1`数组中。要求`nums1`有足够的空间来存储合并后的数组,即`nums1.length >= m + n`。...
10. **查找排序数组中和为给定值的两个数字**:这是经典的“两数之和”问题,使用哈希表可以在O(n)的时间内找到解。 11. **二元查找树镜像**:将二元查找树的结构反转,使得左子树变为右子树,右子树变为左子树。...
然后将长链表指针向前移动长度差的步数,最后同时遍历两个链表,如果它们指向同一节点,则链表相交,否则不相交。 问题扩展: 1. 判断二元树是否为二元查找树的后序遍历结果 知识点:二元查找树、后序遍历、二元...
首先,让我们明确问题描述:给定两个已排序的整数数组nums1和nums2,非空数组nums1的大小是m,nums2的大小是n,需要在原地将nums1扩展以容纳nums2,使得合并后的数组依然有序。也就是说,nums1的大小会变为m+n,且不...
首先,给出的Java代码实现了一个名为`NumberTB`的类,它包含了上排(top)和下排(bottom)两个整型数组,以及一个用于判断是否找到解的布尔变量`success`。类的构造函数初始化了上排数组,将数组元素设置为0到(len-1)的...
在编程领域,"2-sum"问题是一个常见的算法挑战,它涉及到在给定的整数数组中寻找两个元素,使得它们的和等于一个特定的目标值。这个问题对于理解和掌握基础的算法设计以及数据结构优化至关重要,特别是在面试和编程...
可以使用哈希表来实现,以域名或IP为关键字,以DNS解析结果为值。为了满足每秒5000以上的查询,需要优化哈希函数,减少冲突,并可能需要多级哈希或使用Bloom Filter等技术。 在海量日志数据中提取出某日访问百度...
**2.2 寻找和为定值的两个数** - **题目描述**: 给定一个数组和一个目标值,找出数组中和为目标值的两个数。 - **分析与解法**: - 双指针法:适用于已排序数组,一个指针从左开始,一个从右开始,根据和的大小调整...
Bloom filter有两个重要的问题:如何根据输入元素个数n确定位数组m的大小及hash函数个数k;如何支持删除一个已经插入的关键字。 扩展:Counting Bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持...
为了优化这个问题,我们可以采用双指针法,设置两个指针`l`和`r`,分别指向数组的起始位置和末尾位置。`l`用于记录非10元素的下一个插入位置,`r`用于查找非10的元素。 1. 初始化`l`为0,`r`为数组长度减1,`count`...
在排序数组中查找和为给定值的两个数字 - **双指针法**:定义两个指针left和right,分别指向数组的起始位置和结束位置,根据两个指针所指元素之和与目标值的关系移动指针。 - **优化思路**:由于数组已经排序,...
本压缩包“Java和大数据面试.zip”包含了与这两个主题相关的面试准备资料,特别是针对那些希望在Java编程和大数据处理领域寻找工作的专业人士。下面我们将深入探讨其中涉及的知识点。 1. **Java基础**: - **面向...
**题目描述**:给定一个整数数组以及一个特定值sum,判断数组中是否存在两个数的和等于sum。 **解答方法**:采用排序加双指针策略。 1. **排序**:首先将数组进行排序。 2. **双指针**:定义两个指针,一个位于...
5. HashMap 是数组和链表组成的,默认大小为 16,当 hashmap 中的元素个数超过数组大小*loadFactor(默认值为 0.75)时就会把数组的大小扩展为原来的两倍大小,然后重新计算每个元素在数组中的位置。 三、String ...