Leetcode: 704. Binary Search

思路:

将index不断除以2以找到对应的值,while条件是在index保持在>=0 && < array size

 

思路修正:

因为不断地根据寻找的边界限缩,所以index不可能超出前面说的两个范围,因此乾脆改成执行for回圈 log(n)次,并将初始lower bound设为0,upper bound设为array size。

 

在修正:

还是不对,所以改成用lb, ub去判定。

 
 
 

程序

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int ans = -1;
        int lb = 0, ub = nums.size() - 1;
        while(lb <= ub) {
            //cout << "(" << lb << ", " << ub <<  ", " << index << ")";
            int index = lb + (ub - lb) / 2;
            if ( nums[index] < target ) 
                lb = index + 1;
            else if ( nums[index] > target )
                ub = index - 1;
            else {
                ans = index;
                break;
            }
        }
        return ans;
    }
};

 
 

後来

有遇到ERROR: AddressSanitizer: heap-buffer-overflow on address
原因是upper bound 不应该使用arrary size,而是要使用最大index,即array size - 1

 
 

参考

https://zh.wikipedia.org/wiki/二分搜寻演算法


<<:  30天程序语言研究

>>:  30天程序语言研究

Day 8 纸上原型 dirty prototype

最近实在是有点折磨,刚把民航局的案子吿一个段落,最近接到一个大案子,每天要腾个一小时来处理;晚上 I...

Day 28 维护 PostgreSQL 资料库的参数?

昨天笔者有提到, 资料库的运作效率着实让笔者伤透脑筋, 然而资料库的参数是可以调整的 笔者搜寻一大堆...

Day20 霓虹灯文字

霓虹灯文字 教学原文参考:霓虹灯文字 这篇文章会介绍在 GIMP 里使用选取、选取边框、填色、文字、...

Day14 用 100 寸超大萤幕写 Code 的感觉 - 用 metatable 改变预设行为

前两天我已经学会用 CC: Tweaked 电脑读取磁片和播放音乐 今天我要来写 Code 啦 !!...

[C 语言笔记--Day13] Pointers to Functions

pointers to functions 乍听之下好像有点奇怪, 但一个 function 跟资料...