题目描述
描述:稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。
示例1:
输入: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ta"
输出:-1
说明: 不存在返回-1。
示例2:
输入:words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ball"
输出:4
提示:
words的长度在[1, 1000000]之间
解题思路
思路1:最直观的想法是,二分查找。其与普通二分查找的区别在于,该稀疏数组中可能存在空字符串,故需要进行特殊判空处理,即当mid为空时,先尝试一直右移找到第一个非空字符串,如果没找到则恢复mid并使right变为mid-1。
int findString(vector<string>& words, string s)
{
//有序就用二分查找啊!!!
int left=0,right=words.size()-1;
while(left<=right)
{
int mid=left+(right-left)/2;
//用来保存mid以便恢复
int temp=mid;
//首先处理空字符串 如果中间是空字符串则一直右移直至找到非空字符串
while(words[mid]==""&&mid<=right)
mid++;
//如果右边均是空字符串则使用temp恢复mid并处理right
if(mid>right)
{
right=temp-1;
continue;
}
if(words[mid]==s)
return mid;
else if(words[mid]>s)
right=mid-1;
else if(words[mid]<s)
left=mid+1;
}
return -1;
}
总结:该稀疏数组中可能存在空字符串!!!故需要进行特殊判空处理!!!即当mid为空时!!!先尝试一直右移找到第一个非空字符串!!!如果没找到则恢复mid并使right变为mid-1!!!