题目
稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。
示例1:
输入: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ta"
输出:-1
说明: 不存在返回-1。
示例2:
输入:words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ball"
输出:4
分析: 二分查找
class Solution:
def findString(self, words: List[str], s: str) -> int:
def binary_search(left, right):
mid = (left + right) // 2
if words[mid] == s:
return mid
if left == mid:
if words[right] == s:
return right
else:
return -1
if words[mid]:
if words[mid] > s:
return binary_search(left, mid)
else:
return binary_search(mid, right)
else:
k = binary_search(left, mid)
if k != -1:
return k
else:
return binary_search(mid, right)
return binary_search(0, len(words)-1)
方法2: 遇到非法字符,线性遍历,继续二分
class Solution:
def findString(self, words: List[str], s: str) -> int:
def binary_search(left, right):
mid = (left + right) // 2
if left > right:
return -1
while words[mid] == '' and mid < right:
mid += 1
if words[mid] == s:
return mid
elif words[mid] > s:
return binary_search(left, (left + right) // 2-1)
else:
return binary_search(mid+1, right)
return binary_search(0, len(words)-1)