面试题 10.05. 稀疏数组搜索

题目

稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。

示例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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值