“Binary search”的版本间的差异

来自wrc's Wiki
跳到导航 跳到搜索
 
第17行: 第17行:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
注意 <code>'''low <= high'''</code>, <code>'''low = mid + 1'''</code> 和 <code>'''high = mid - 1'''</code>。<code>while</code> 循环结束后 <code>low</code> 的位置是新元素的插入位置。
+
注意 <code>'''low <= high'''</code>, <code>'''low = mid + 1'''</code> 和 <code>'''high = mid - 1'''</code>。<code>while</code> 循环结束后 <code>low</code> 的值是新元素的插入位置。
  
 
== 变化 ==
 
== 变化 ==

2022年1月2日 (日) 17:18的最新版本

二分法。

一般 pattern

low = 0
high = n
while low <= high:
    mid = (low + high) // 2
    mid_calc = f(mid)
    if mid_calc == target:
        return g(mid)
    elif mid_calc < target:
        low = mid + 1
    else:
        high = mid - 1
return default_retval

注意 low <= high, low = mid + 1high = mid - 1while 循环结束后 low 的值是新元素的插入位置。

变化

mid 赋值为 floor((left + right) / 2) 时,需要用 left = mid + 1right = mid,循环判断为 left < right [1]

合并大于和等于的情况

如需找到元素第一次出现的下标(Leetcode 34. Find First and Last Position of Element in Sorted Array),可将 mid_calc 等于和大于的情况合并,并给新的 high 赋值时不 + 1

C++ 示例:[2]

int lower_bound(vector<int> &nums, int target) {
    int low = 0;
    int high = nums.size();
    int mid;
    while (low < high) {
        mid = low + (high - low) / 2;
        if (nums[mid] >= target) {
            high = mid;
        } else {
            low = mid + 1;
        }
    }
    return low;
}

参考资料