目录

三个月算法进阶--day51

比O(n)更快的就是O(log n)

当O(n)是显而易见的答案时,就要思考二分查找来更快。

pivot中心点

第一次计算可放在循环中

二分防溢出

low + (high - low) // 2

二分防无限循环

至少一个边界在移动的时候不能到pivot,而是需+-1

二分查找防遗漏

如果可以和两个边界比较,那么可只考虑一个来划分全部情况

记录

leetcode剑指offer第11题旋转数组的最小数字

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

找局部匹配即搜索

深搜(回溯、暴力搜索)+剪枝

leetcode剑指offer第12题矩阵中的路径

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        def dfs(m, n, k):
            if m >= len(board) or m < 0 or n < 0 or n >= len(board[0]) or board[m][n] != word[k]:
                return False
            if k == len(word) -1:
                return True
            tmp, board[m][n] = board[m][n], "#"
            res = dfs(m+1, n, k+1) or dfs(m, n+1, k+1) or dfs(m-1, n, k+1) or dfs(m, n-1, k+1)
            board[m][n] = tmp
            return res
        
        for i in range(len(board)):
            for t in range(len(board[0])):
                if dfs(i, t, 0):
                    return True
        return False