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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章