The termination conditions about the binary search

来源:互联网 发布:淘宝网店图标 编辑:程序博客网 时间:2024/05/16 03:09

About some thoughts of binary search:

To avoid some confusion of the binary search, like dead-loop or something.

Every time i write binary search, i always use the 'while' condition like this:

int l = 0;int r = nums.size()-1;while (l < r-1) {// insert the specific code} 


And then to check both the nums[l] and nums[r] with the final result.

This way could definitely eliminate the possibility of  dead-loop, like 'l' always be the 'mid', and 'mid' always equals to 'l'.

But this way is not very elegant, so, when could we use the condition like:

while (l<r) {// insert the code here}


To do like this way, we need have condition like:

while (l < r) {            int mid = l + (r - l) / 2;            if (citations[mid] >= size-mid) r = mid;            else l = mid + 1; // The key}


So if, l = mid + 1, then we could use while (l < r).

Like the following problem: https://leetcode.com/problems/h-index-ii/

Both solution can reach the correct answer:

// First Editionclass Solution {public:    int hIndex(vector<int>& citations) {        if ((int)citations.size() == 0) return 0;        int size = (int)citations.size();        int l = 0;        int r = size - 1;        while (l < r-1) {            int mid = l + (r - l) / 2;            if (citations[mid] >= size-mid) r = mid;            else l = mid + 1;        }        if (citations[l] >= size - l) return size-l;        else if (citations[r] >= size - r) return size-r;        return 0;    }};// We can also write like thisclass Solution {public:    int hIndex(vector<int>& citations) {        if ((int)citations.size() == 0) return 0;        int size = (int)citations.size();        int l = 0;        int r = size - 1;        while (l < r) {            int mid = l + (r - l) / 2;            if (citations[mid] >= size-mid) r = mid;            else l = mid + 1;        }        if (citations[r] != 0)            return size-r;        return 0;    }};









0 0