Bootstrap

leetcode Hot100

1.单词搜索

在这里插入图片描述


class Solution:
    """
    leetcode79 二维网格单词搜索
    """


    def isExit(self,board,word,x,y,idx,roads):
        """
        递归过程
        :param board:
        :param word:
        :param idx:
        :param roads:
        :return:
        """
        if idx==len(word):
            #所有的字母都查询完了
            return True

        if x>=0 and x<len(board) and y>=0 and y<len(board[0]) and ([x,y] not in roads):
            if board[x][y]==word[idx]:
                #这个位置上可以查询到第一个字母
                roads.append([x,y])

                #接下来查询下一个字母,位置范围是(x-1,y)...
                idx+=1
                if self.isExit(board,word,x-1,y,idx,roads):
                    return True
                if self.isExit(board,word,x+1,y,idx,roads):
                    return True
                if self.isExit(board,word,x,y-1,idx,roads):
                    return True
                if self.isExit(board,word,x,y+1,idx,roads):
                    return True

                #上面这些位置都查询不到的话,退一步
                roads.pop()
                idx-=1 
        return False
        
    def exist(self,board,word):
        """

        :param board:
        :param word:
        :return:
        """
        roads=[]
        for i in range(len(board)):
            for j in range(len(board[0])):
                if self.isExit(board,word,i,j,0,roads):
                    return True
        else:
            return False

分析:回溯算法与递归
回溯过程:当前点(x,y),搜索(x-1,y),(x+1,y),(x.y-1),(x,y+1)四个位置,这些位置需要满足1. 不过界 ,2. 不在已经搜索过的路径上。从先判断(x,y)位置是不是第一个字母,若是,则搜索它周围的点,这个过程就是一个递归的过程,
递归过程:递归的过程及重复调用自身函数的过程。
函数体:本题中需要重复的是,(x,y)位置与当前字母匹配吗,位置符合要求,查询下一个位置(即递归),递归出口:单词每个字母都查询完成或没有符合的可选位置了。

2. 不同路径(62)

在这里插入图片描述

class UniquePaths:
    def uniquePaths(self, m: int, n: int) -> int:
        """
        :param m: m>=1
        :param n: n>=1
        :return:
        """
        if m<1 or n<1:
            return False

        x0,y0=0,0
        x1,y1=m-1,n-1

        steps=x1-x0+y1-y0
        shang=1
        for i in range(n-1):
            shang=shang*(steps-i)

        xia=self.factorial(y1)
        return int(shang/xia)


    def factorial(self,x):
        """
        求x的阶乘
        :param x: >=0
        :return:
        """
        if x == 0 or x == 1:
            return 1
        else:
            return (x * self.factorial(x - 1))

分析:从题目可以分析,73大小的格子,起点(0,0),终点(6,2),一共要走6-0+2-0=8步,到达终点,这八步中,需要向下走2步,即从8步中,选择两2向下走,C8,2=(87)/(2*1)=28

;