给定一个已排序的数组和一个数字x,在数组中找到总和最接近x的对
如果您想练习数据结构和算法程序,可以通过 数据结构和算法面试题.
问题:
1 2 3 4 |
数组[]={-40,-5,1,3,6,7,8,20}; 的 对 谁的 和 是 最近的 至 5 : 1 和 3 |
解决方案:
解决方案1:
您可以检查每一对数字并找到接近X的总和。
爪哇代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
上市 静态的 虚空 findPairWithClosestToXBruteForce(整型 rr[],整型 X) { 如果(rr.长度<2) 返回; //假设第一个两个元素的X差异最小 整型 MinimumDiff=数学.腹肌(rr[0]+rr[1]-X); 整型 对1stIndex=0; 整型 对2ndIndex=1; 对于 (整型 i = 0; i < rr.长度; i++) { 对于 (整型 j = i+1; j < rr.长度; j++) { 整型 tempDiff=数学.腹肌(rr[i]+rr[j]-X); 如果(tempDiff< MinimumDiff) { 对1stIndex=i; 对2ndIndex=j; MinimumDiff=tempDiff; } } } 系统.出.打印(“使用暴力法,其和最接近X的对:”+rr[对1stIndex]+”+ rr[对2ndIndex]); } |
Solution 2:
- 我们将维护两个索引,一个索引在开头(l = 0),另一个在结尾(r = n-1)
- 重复直到 < r
- 将差异计算为arr [l] + rr [r] -x
- 如果绝对(差异) < minDiff then update the minimum 和 和 对.
- 如果arr [l] + rr [r]小于X,这意味着如果我们想找到与X接近的和,请执行r–
- 如果arr [l] + rr [r]大于0,这意味着如果我们想找到和X接近的和,请执行l ++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
上市 静态的 虚空 findPairWithClosestToX(整型 rr[],整型 X) { 整型 MinimumDiff = 整数.MAX_VALUE; 整型 n=rr.长度; 如果(n<0) 返回; //左右索引变量 整型 l = 0, r = n-1; //变量,以跟踪左侧和右侧对的minimumSum 整型 minLeft = l, minRight = n-1; 而(l < r) { 整型 currentDiff= 数学.腹肌(rr[l] + rr[r]-X); / *如果abs(diff)小于min dif,我们需要更新总和并配对* / 如果(currentDiff < MinimumDiff) { MinimumDiff = currentDiff; minLeft = l; minRight = r; } 如果(rr[l] + rr[r] < X) l++; 其他 r-; } 系统.出.打印(“总和最接近X的对:” +rr[minLeft]+”+ rr[minRight]); } |
时间复杂度:O(NLogN)
爪哇程序查找总和最接近X的一对:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
包 组织.Arpit.爪哇2blog; 上市 类 FindPairClosestToXMain { 上市 静态的 虚空 主要(串[] args) { 整型 数组[]={-40,-5,1,3,6,7,8,20}; findPairWithClosestToXBruteForce(数组,5); findPairWithClosestToX(数组,5); } 上市 静态的 虚空 findPairWithClosestToXBruteForce(整型 rr[],整型 X) { 如果(rr.长度<2) 返回; //假设第一个两个元素的X差异最小 整型 MinimumDiff=数学.腹肌(rr[0]+rr[1]-X); 整型 对1stIndex=0; 整型 对2ndIndex=1; 对于 (整型 i = 0; i < rr.长度; i++) { 对于 (整型 j = i+1; j < rr.长度; j++) { 整型 tempDiff=数学.腹肌(rr[i]+rr[j]-X); 如果(tempDiff< MinimumDiff) { 对1stIndex=i; 对2ndIndex=j; MinimumDiff=tempDiff; } } } 系统.出.打印(“使用暴力法,其和最接近X的对:”+rr[对1stIndex]+”+ rr[对2ndIndex]); } 上市 静态的 虚空 findPairWithClosestToX(整型 rr[],整型 X) { 整型 MinimumDiff = 整数.MAX_VALUE; 整型 n=rr.长度; 如果(n<0) 返回; //左右索引变量 整型 l = 0, r = n-1; //变量,以跟踪左侧和右侧对的minimumSum 整型 minLeft = l, minRight = n-1; 而(l < r) { 整型 currentDiff= 数学.腹肌(rr[l] + rr[r]-X); / *如果abs(diff)小于min dif,我们需要更新总和并配对* / 如果(currentDiff < MinimumDiff) { MinimumDiff = currentDiff; minLeft = l; minRight = r; } 如果(rr[l] + rr[r] < X) l++; 其他 r-; } 系统.出.打印(“总和最接近X的对:” +rr[minLeft]+”+ rr[minRight]); } } |
当您运行上述程序时,将获得以下输出:
1 2 3 4 |
的 对 谁的 和 是 最近的 至 X 使用 蛮力 力 方法: 1 3 的 对 谁的 和 是 最近的 至 X : 1 3 |