剑指OFFER DAY5

第 5 天

查找算法(中等)


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

 剑指OFFER DAY5_第1张图片

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

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

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

当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. 旋转数组的最小数字

剑指OFFER DAY5_第2张图片

二分查找 

class Solution:
    def minArray(self, numbers: List[int]) -> int:
        if len(numbers)==1:return numbers[0]
        left = 0
        right = len(numbers)
        while left0:
                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. 第一个只出现一次的字符

剑指OFFER DAY5_第3张图片

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

 此方法需要遍历两边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 ' '

你可能感兴趣的:(刷题心得,算法,leetcode,职场和发展)