3.11 一轮练习hot100(79. 单词搜索 96. 不同的二叉搜索树 )

题一:79. 单词搜索

在这里插入图片描述
在这里插入图片描述

链接

题目链接:
文章链接:

关键点

  1. 其实随想录有很多类似的,本题只是基础题,所以这一块需要加强
  2. 整体思路:先写主循环,判断首个字母相等才进入递归;回溯体现在某轮递归对已走过的元素的标记,且结束之后取消标记

编程思路

Me:

力扣实战

思路一:

class Solution:
    # 定义上下左右四个行走方向
    
    def exist(self, board, word):
        """
        :type board: List[List[str]]
        :type word: str
        :rtype: bool
        """
        m = len(board)
        n = len(board[0])
        mark = [[0]*n for _ in range(m)]
        directs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
        def backtrack(i, j, mark, board, word):
            if len(word) == 0:  #长度为零说明word的最后一个元素也已经被考虑了
                return True
            
            for direct in directs: #方向移动
                cur_i = i + direct[0]
                cur_j = j + direct[1]
                
                if cur_i >= 0 and cur_i < len(board) and cur_j >= 0 and cur_j < len(board[0]) and board[cur_i][cur_j] == word[0]:   #处理越界,若越界,则此方向取消
                    # 如果是已经使用过的元素,忽略
                    if mark[cur_i][cur_j] == 1:
                        continue
                    # 将该元素标记为已使用
                    mark[cur_i][cur_j] = 1
                    if backtrack(cur_i, cur_j, mark, board, word[1:]) == True:
                        return True
                    else:
                        # 回溯
                        mark[cur_i][cur_j] = 0
            return False
        #主循环:按行遍历每一个元素,当等于word[0]时才进入递归
        for i in range(m):
            for j in range(n):
                if board[i][j] == word[0]:
                    # 将该元素标记为已使用
                    mark[i][j] = 1
                    if backtrack(i, j, mark, board, word[1:]) == True:
                        return True
                    else:
                        # 回溯
                        mark[i][j] = 0
        return False 
        
# 反思1:

思路二:

 

题二:96. 不同的二叉搜索树

在这里插入图片描述

链接

题目链接:
文章链接:

关键点

  1. 卡特兰数真的很绝,搜了一下百度百科他还能解决以下问题: n对括号正确匹配数目 凸多边形三角划分 出栈次序 矩阵连乘括号化:矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案。( h(n) 种)

编程思路

Me:

力扣实战

思路一:递归法

在这里插入图片描述

 class Solution:
    def numTrees(self, n: int) -> int:
        #思路1:递归 dfs 最外层以每个数字为起点
        #思路2:看完标签有个dp,树是中间对称的,个数为奇数是会单一个
        #两个辣鸡思路 
        dp =[0]*(n+1)  #dp[i]表示n为i时互不相同的种类数。n为i时,说明i的左子树由1到i-1组成,由dp[i-1]个组成
        dp[0]=1 #的方法,右边由i+1到n组成,有dp[n-i]个组法
        dp[1]=1
        
        for i in range(2,n+1):
            for j in range(0,i):    #从0到i-1和从i-1到0,两个数字加起来等于i-1
                dp[i] += dp[j]*dp[i-j-1]    #
        return dp[-1]

        
# 反思1:

题三:

题四:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值