1.题目
稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。
示例1:
输入: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ta"
输出:-1
说明: 不存在返回-1。
示例2:
输入:words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ball"
输出:4
提示:
words的长度在[1, 1000000]之间
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sparse-array-search-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
普通二分,需要处理遇到空串时,无法确定所查找的元素在左区间还是在右区间,向后推以为继续判断。
只要不是空串,就可以比较该位置元素和目标元素的相对位置。
class Solution
{
public:
int findString(vector<string>& words, string s)
{
int L = 0, R = words.size() - 1 ;
while(L <= R)
{
int mid = L + (R - L) / 2;
while(mid <= R && words[mid] == "")
mid++;
if(mid > R)
{
R = L + (R - L) / 2 - 1;
continue;
}
if(words[mid] == s) return mid;
else if(words[mid] < s) L = mid + 1;
else R = mid - 1;
}
return -1;
}
};