c++ - 澄清两个指针方法的工作
问题描述
我对使用两个指针方法有一些疑问。
情况 1: - 假设我们有一个已排序的数组 A 和一个目标值 B。我们想找出是否存在两个差值等于 B 的元素。
int helper(vector<int> &A, int B)
{
int left = 0, n = A.size();
int right = left + 1;
while (right < n)
{
int currDiff = A[right] - A[left];
if (currDiff < B)
right++;
else if (currDiff > B)
{
left++;
if (left == right)
right++;
}
else
return 1;
}
return 0;
}
情况 2: - 假设我们有一个已排序的数组 A 和一个目标值 B。我们想找出是否存在两个总和等于 B 的元素。
int helper(vector<int> &A, int B)
{
int left = 0, n = A.size();
int right = n - 1;
while (left < right)
{
int currSum = A[right] + A[left];
if (currSum < B)
left++;
else if (currSum > B)
{
right--;
}
else
return 1;
}
return 0;
}
值得怀疑的是,在情况 1 中,我们将两个指针都设置在左侧(left = 0, right = left + 1
)并开始扫描,而在情况 2 中,我们将一个指针设置在左侧,另一个指针设置在右侧(left = 0, right = A.size() - 1
)。
我对这是如何工作的有点困惑。
解决方案
没有规定您必须以不同的方式设置两个指针。这完全取决于您所遵循的算法。这可能是好的,也可能是坏的。比方说,为了区别,我们设置了left=0
and right=A.size()-1
。当给定数组排序时,和A
之间的第一个差异将是最大的。A[right]
A[left]
int currDiff = A[right] - A[left]; //max possible value for currDiff for A
那么,现在如果currDiff
大于给定的数字,你会怎么做?增加left
或减少right
?假设你做后面的,我的意思是减少right
,并且相应的条件再次满足,做同样的事情,减少right
。现在,假设现在你得到的currDiff
小于给定的数字,你会怎么做?增加left
? 大概。但是在下一次迭代中,如果满足同样的条件,也currDiff
就是仍然小于给定的数,那现在怎么办?再次增加left
? 如果right
在这个特定位置增加 会给你带来结果怎么办?
finding diff of pair
所以,你看,如果你开始在相反的两端有左右,就会出现很多需要处理的情况。
最后,我想说的是,这一切都与您遵循的算法有关,仅此而已。
推荐阅读
- python - 如何指定将数据返回为 JSON 的请求?
- java - 如何使用类和对象输入字符
- bash - 如何在 OSX 的命令行中用鼠标右键单击屏幕坐标
- c++ - 如何在 C++ 中为类似操作重用函数
- java - android studio调色板所有图标都相同
- python - 用于在 Python 中匹配具有相似 ID 字符串的两个集合的分类器
- python - 使用 `python setup.py develop` 安装更多文件
- hadoop - FairSchduler 中瞬时公平份额的用途是什么?
- java - 如何在不检查同一事物的情况下检查一个数组中的值是否相等
- python - 如何在 python 中使用 x-api-key、accesskey 和 securityKey 通过 endponint api 从 aws dynamodb 发布或获取数据