剑指OFFER DAY5

第 5 天

查找算法(中等)


剑指 Offer 04. 二维数组中的查找

 

这道题一开始看到递增数组我想使用二分查找,但是效率很低

然后看到使用线性查找可能更方便,因为矩阵中有两个特殊点,左下和右上。

左下的点比他大的点都在它右边,比他小的点都在它上面。

当target小于matrix点时,上移;当target大于matrix点时右移。

以下是代码

class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        start = 0
        if matrix==[] or matrix==[[]]:
            return False
        n = len(matrix)-1
        m = len(matrix[0])-1
        
        while start<=m and n>=0:
            print (matrix[n][start])
            if matrix[n][start] > target:
                n -= 1
            elif matrix[n][start] < target:
                start += 1
            else:
                return True
        return False

 

剑指 Offer 11. 旋转数组的最小数字

二分查找 

class Solution:
    def minArray(self, numbers: List[int]) -> int:
        if len(numbers)==1:return numbers[0]
        left = 0
        right = len(numbers)
        while left<right:
            mid = (left+right)//2
            if numbers[mid]-numbers[0]>0:
                left = mid+1
            elif numbers[mid]-numbers[0]<0:
                if numbers[mid-1]>numbers[mid]:
                    return numbers[mid]
                right = mid
            else:
                right -= 1
                if numbers[right-1]>numbers[right]:
                    return numbers[right]
        return numbers[0]

面试题50. 第一个只出现一次的字符

这一题一上来我想到的做法是哈希表法

 此方法需要遍历两边string,第一遍存频数,第二遍找出频数为1的第一个元素

class Solution:
    def firstUniqChar(self, s: str) -> str:
        hashtable = []
        for i in s:
           hashtable[ord(i)-97]+=1
        for j in s:
            if hashtable[ord(j)-97] == 1:
                return j
        return ' '

下面是官方解答,依然也是遍历两遍string

class Solution:
    def firstUniqChar(self, s: str) -> str:
        frequency = collections.Counter(s)
        for i, ch in enumerate(s):
            if frequency[ch] == 1:
                return ch
        return ' '

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Weber77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值