在排序数组中查找具有给定总和的对 - 是否有正确性证明?

时间:2016-12-06 06:55:55

标签: algorithm

我在几十个帖子中看到了2指针算法,即:

OBR|1|METABOLIC PANEL|OBR_filename_1
OBX|1|Glucose|OBR_filename_1
OBX|2|BUN|OBR_filename_1
OBX|3|CREATININE|OBR_filename_1
OBR|2|RFLX TO VERIFICATION|OBR_filename_2
OBX|1|EGFR|OBR_filename_2
OBX|2|SODIUM|OBR_filename_2
OBR|3|AMBIGUOUS DEFAULT|OBR_filename_3
OBX|1|POTASSIUM|OBR_filename_3

我知道它有效。我甚至在接受采访时解决了这个问题。但我无法找到任何正确性证据,甚至无法找到它为何起作用的直观解释。

有人可以提供解释或链接吗?

由于

1 个答案:

答案 0 :(得分:3)

想象一下B[i,j] = A[i] + A[j]的二维数组。请注意,数组中的所有数字从左到右,从上到下依次递增。

设置l=0, r=n-1 - 这是整个2D数组的右上角,元素B [0,n-1],并开始搜索。

对于每个索引对(l,r),我们可以看到三个机会(我省略检查指针交叉点):

找到X = B[l,r] =>的总和所以我们找到了所需的索引。退出。

X < B[l, r] =&gt;由于列的排序顺序,此列的所有元素都太大,因此我们可以排除此列,并递减r(向左移动)

X > B[l, r] =&gt;由于行的排序顺序,此行的所有元素都太小,因此我们可以排除此行,并递增l(向下移动)

请注意,在每个步骤中,我们都会使用可能的解决方案保留在子阵列的右上角,这就是为什么最后两个案例可以工作