while(left<=right)
there是完整的代码:
public static int searchFirstOfK(List<Integer> A, int k) {
int left = 0, right = A.size() - 1, result = -1;
// A.subList(left, right + 1) is the candidate set.
while (left <= right) {
int mid = left + ((right - left) / 2);
if (A.get(mid) > k) {
right = mid - 1;
} else if (A.get(mid) == k) {
result = mid;
// Nothing to the right of mid can be the first occurrence of k.
right = mid - 1;
} else { // A.get(mid) < k
left = mid + 1;
}
}
return result;
}
我如何知道何时使用左侧的距离小于或等于右,或者仅使用左图小于右。
在此答案上构建另一个二进制搜索问题:
如何简化C?
valueToFind
链接的答案突出了以这种方式编写二进制搜索的几个优点。
简单地提出了编号考虑数组仅具有一个元素的情况,即,要搜索的元素也是
{0}
。
在这种情况下,0
while(left<right)
此答案是在已发布的代码的上下文中。如果我们谈论的是替代方案,以便我们可以使用
searchFirstOfK
,那么马特·蒂默尔人的答案是正确的,并且是一种更好的方法。
贝洛(Below)是马特(OP-称为普通二进制)和Matt Timmermans(我们称其为优化的二进制)方法的thecomparison,用于包含0到5000000之间的值的列表:
这个是一个非常有趣的问题。事情是有一种方法可以始终正确地进行二进制搜索。事情是确定正确的范围并避免单个元素卡住行为。
-1
仅要记住的关键是,您总是将左派作为最小的不满意元素,并且是最大的条件满足元素。一旦您通过此方法理解范围划分,您将永远不会在二进制搜索中失败。
上面的初始化将为您提供满足最大的条件。通过更改初始化,您可以获得各种元素(例如满足元素的小条件)。