【发布时间】:2021-08-23 12:57:29
【问题描述】:
我正在解决classical binary search problem:
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.empty()) return -1;
int lo=0, hi=nums.size()-1;
while(lo<hi) {
int mid=lo+(hi-lo)/2;
//if element found at position mid, return mid
if(nums[mid]==target) return mid;
if(nums[mid]<target) lo=mid+1;
//why not hi=mid-1, since if mid _could_ have our answer, we would
//have already returned above
else hi=mid;
}
// if element not found, return -1;
return nums[lo]==target ? lo : -1;
}
};
我正在寻找设置hi=mid 的直观解释(特别是while 循环条件为lo<hi 而不是lo<=hi)。我认为我们应该将其设置为hi=mid-1,因为我们知道mid 不能包含我们的答案(如果包含,那么我们已经返回)。是的,我可以在几个示例上进行尝试,但我试图直观地了解在开发逻辑(在开始编码之前)时搜索空间是如何减少的,以便我可以想出一个具体的适用于所有示例的算法。
【问题讨论】:
-
如果
nums为空,那你的问题就很大了。 -
@PaulMcKenzie,是的,是的。我已经编辑了代码。感谢您指出了这一点! :)
-
再看你写的。设置
hi=mid和lo<hi描述您不了解的当前情况,设置hi=mid-1和lo<=hi描述您认为会更好的情况。你能想出一个案例,这些情况有不同的功能吗? -
@JaMiT,你的意思是当
lo==hi? -
@Someone 好的,我应该要求一个案例加上解释功能的不同之处。
lo==hi在这两种情况下会发生什么?
标签: c++ algorithm binary-search