9.5-字符串有序数组的二分查找

来源:互联网 发布:ff14npc捏脸数据 编辑:程序博客网 时间:2024/05/02 06:08

Given a sorted array of strings which is interspersed with empty strings, write a method to find the location of a given string.
Example: find “ball” in [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”, “dad”, “”, “”] will return 4
Example: find “ballcar” in [“at”, “”, “”, “”, “”, “ball”, “car”, “”, “”, “dad”, “”, “”] will return -1

可以直接遍历一遍查找,但是O(n)不够好;

因为已经排好序,所以binary search.

每次t=mid,然后遇到空格就t++直到大于high。

1.如果t>high,说明[mid, high]这一段都是空格,就需要在[low, mid-1]去找。

2.如果在[mid, t]这一段里面找到x,那么就返回。

3.如果在[mid, t]第一个不是空格的string > x, 说明x要在[low, mid-1]去找。

3.如果在[mid, t]第一个不是空格的string < x, 说明x要在[t+1, high]去找。

#include <iostream>#include <string>using namespace std;int search(string s[], int low, int high, string x){    if(x=="")        return -1;    while(low<=high)    {        int mid=low+(high-low)/2;        int t=mid;        while(s[t]=="" && t<=high)            t++;        if(t>high)        {            high=mid-1;        }        else        {            if(s[t]==x)                return t;            else if(s[t]>x)                high=mid-1;            else                low=t+1;        }    }    return -1;}int main(){    string s[13] =    {        "at", "", "", "", "ball", "", "", "car", "", "", "dad", "", ""    };    cout<<search(s, 0, 12, "ball")<<endl;    return 0;}


0 0
原创粉丝点击