【力扣hot100】刷题笔记Day19

前言

  • 回溯回溯回溯!早上整理档案竟然用了桶排序,不愧是算法狂魔们

79. 单词搜索 - 力扣(LeetCode)

  • DFS

    • class Solution:def exist(self, board: List[List[str]], word: str) -> bool:m, n = len(board), len(board[0])# used = [[0] * n for _ in range(m)]word_len = len(word)self.flag = Falsedef dfs(x, y, index):if index == word_len:self.flag = Truereturnfor x0, y0 in ((x-1, y), (x, y-1), (x+1, y), (x,y+1)):# if 0 <= x0 < m and 0 <= y0 < n and board[x0][y0] == word[index] and used[x0][y0] == 0:if 0 <= x0 < m and 0 <= y0 < n and board[x0][y0] == word[index]:# used[x0][y0] = 1board[x0][y0] = ''           # 置为空字符避免重复dfs(x0, y0, index+1)board[x0][y0] = word[index]  # 回溯# used[x0][y0] = 0for i in range(len(board)):for j in range(len(board[0])):if board[i][j] == word[0]:# used[i][j] = 1board[i][j] = ''        # 置为空字符避免重复dfs(i, j, 1)board[i][j] = word[0]   # 回溯# used[i][j] = 0if self.flag: return self.flag  # 剪枝,找到一条就可以退出了return self.flag

 131. 分割回文串 - 力扣(LeetCode)

  • 回溯(分割)

    • 动规判断回文串的方法看【代码随想录】刷题笔记Day54-CSDN博客
    • class Solution:def partition(self, s: str) -> List[List[str]]:# # 双指针判断是否回文串# def isPalindrome(s, left, right):#     while s[left] == s[right]:#         left += 1#         right -= 1#         if left >= right: return True#     return False  # # 优化:动规法判断回文串# def computePalindrome(s, isPalindrome):#     for i in range(len(s) - 1, -1, -1):  # 需要倒序计算,保证在i行时,i+1行已经计算好了#         for j in range(i, len(s)):#             if j == i:#                 isPalindrome[i][j] = True#             elif j - i == 1:#                 isPalindrome[i][j] = (s[i] == s[j])#             else:#                 isPalindrome[i][j] = (s[i] == s[j] and isPalindrome[i+1][j-1]) # isPalindrome = [[False] * len(s) for _ in range(len(s))]  # 初始化isPalindrome矩阵# computePalindrome(s, isPalindrome)  # 到时候直接查,isPalindrome[i][j]代表s[i:j]闭区间是否是回文字串path = []res = []n = len(s)def backtrack(start = 0):if start == n:res.append(path[:])for i in range(start, n):# if isPalindrome(s, start, i):  # 利用双指针判断回文if s[start:i+1] == s[start:i+1][::-1]:  # 利用python特性直接判断回文# if isPalindrome[start][i]:   # 利用动规预先存好的dp数组判断回文path.append(s[start:i+1])backtrack(i+1)path.pop()backtrack()return res

分割补充

 93. 复原 IP 地址 - 力扣(LeetCode)

  • class Solution:def restoreIpAddresses(self, s: str) -> List[str]:# 送进来的是1~3位字符串def isValid(s):if s[0] != '0' and 1 <= int(s) <= 255:return Trueelif len(s) == 1 and int(s) == 0:return Trueelse:return Falsepath = []res = []n = len(s)def backtrack(start = 0):if start == n and len(path) == 4:res.append(".".join(path))for i in range(start, start + 3):  # 只要往后3位if i < n:  # 不要越界# 剪枝:剩余字符数 > 3*割完后剩下要割的数量if n - i - 1 > 3 * (3 - len(path)):continuetmp = s[start:i+1]if isValid(tmp):path.append(tmp)backtrack(i+1)path.pop()backtrack()return res

 51. N 皇后 - 力扣(LeetCode)

  • 回溯(占坑)

    • 自己写出来的,成就感max,虽然蠢但是还想记录下来
    • class Solution:def solveNQueens(self, n: int) -> List[List[str]]:used = [[0] * n for _ in range(n)]  # 0代表可放,大于1表示不可放path = []res = []def backtrack(row = 0):if row == n:res.append(path[:])returnfor col in range(n):if used[row][col] == 0:tmp = col*'.' + 'Q' + (n-col-1)*'.'path.append(tmp) # 往下占坑l_col = r_col = colfor row_now in range(row+1, n):l_col -= 1  r_col += 1  used[row_now][col] += 1  # 正下方if l_col >= 0: used[row_now][l_col] += 1  # 左斜向下if r_col <= n-1: used[row_now][r_col] += 1  # 右斜向下# 进入下一行backtrack(row+1)# 回溯退坑l_col = r_col = colfor row_now in range(row+1, n):l_col -= 1r_col += 1used[row_now][col] -= 1  # 正下方if l_col >= 0: used[row_now][l_col] -= 1  # 左斜向下if r_col <= n-1: used[row_now][r_col] -= 1  # 右斜向下path.pop()backtrack()return res
  •  回溯(合法)

    • class Solution:def solveNQueens(self, n: int) -> List[List[str]]:# 从上往下放棋子# 按照row从小到大放置皇后board = [['.'] * n for _ in range(n)]res = []# 表示board中小于row的那些行(row上面的那些行)已经放置皇后了# 这一步开始往第row行放皇后def backtrack(row):n = len(board)# 如果到最后一行了,则将结果添加到res里if row == n:tmp = [''.join(i) for i in board]res.append(tmp)returnfor col in range(n):if not self.isValid(board, row, col):continueboard[row][col] = 'Q'backtrack(row + 1)board[row][col] = '.'backtrack(0)return res # 查看是否可以在board[row][col]的位置放置皇后def isValid(self, board, row, col):n = len(board)# 查看上方是否有Qfor i in range(row):if board[i][col] == 'Q':return False# 查看右上方是否有Qfor i, j in zip(range(row - 1, -1, -1), range(col + 1, n, 1)):if board[i][j] == 'Q':return False# 查看左上方是否有Qfor i, j in zip(range(row - 1, -1, -1), range(col - 1, -1, -1)):if board[i][j] == 'Q':return Falsereturn True 

棋盘补充 

37. 解数独 - 力扣(LeetCode)

  • 回溯(双重递归 + 合法判断)

    • class Solution:def solveSudoku(self, board: List[List[str]]) -> None:"""Do not return anything, modify board in-place instead."""self.backtracking(board)def backtracking(self, board: List[List[str]]) -> bool:# 若有解,返回True;若无解,返回Falsefor i in range(len(board)): # 遍历行for j in range(len(board[0])):  # 遍历列# 若空格内已有数字,跳过if board[i][j] != '.': continuefor k in range(1, 10):if self.is_valid(i, j, k, board):board[i][j] = str(k)if self.backtracking(board): return Trueboard[i][j] = '.'# 若数字1-9都不能成功填入空格,返回False无解return Falsereturn True # 有解def is_valid(self, row: int, col: int, val: int, board: List[List[str]]) -> bool:# 判断同一行是否冲突for i in range(9):if board[row][i] == str(val):return False# 判断同一列是否冲突for j in range(9):if board[j][col] == str(val):return False# 判断同一九宫格是否有冲突start_row = (row // 3) * 3start_col = (col // 3) * 3for i in range(start_row, start_row + 3):for j in range(start_col, start_col + 3):if board[i][j] == str(val):return Falsereturn True
  • 回溯(剩余数字set取交集) 

    • class Solution:def solveSudoku(self, board: List[List[str]]) -> None:row = [set(range(1, 10)) for _ in range(9)]  # 行剩余可用数字col = [set(range(1, 10)) for _ in range(9)]  # 列剩余可用数字block = [set(range(1, 10)) for _ in range(9)]  # 块剩余可用数字empty = []  # 收集需填数位置for i in range(9):for j in range(9):if board[i][j] != '.':  # 更新可用数字val = int(board[i][j])row[i].remove(val)col[j].remove(val)block[(i // 3)*3 + j // 3].remove(val)else:empty.append((i, j))def backtrack(iter=0):if iter == len(empty):  # 处理完empty代表找到了答案return Truei, j = empty[iter]b = (i // 3)*3 + j // 3for val in row[i] & col[j] & block[b]:  # set取交集row[i].remove(val)col[j].remove(val)block[b].remove(val)board[i][j] = str(val)if backtrack(iter+1):return Truerow[i].add(val)  # 回溯col[j].add(val)block[b].add(val)return Falsebacktrack()

后言

  • 回溯搞定!!感觉模板已经有印在脑子里了,希望下次遇到还能写。另外,自己写出N皇后和看最后很优雅的数独set的方法真的颅内高潮了,这就是刷题的正反馈吧! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/714794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谈谈高并发系统的设计方法论

谈谈高并发系统的设计方法论 何为高并发系统&#xff1f;什么是并发&#xff08;Conurrent&#xff09;&#xff1f;什么是高并发&#xff08;Hight Concurrnet&#xff09;&#xff1f;高并发的衡量指标有哪些&#xff1f; 实现高并发系统的两大板块高并发系统应用程序侧的设计…

腾讯云学生服务器使用教程_申请腾讯云学生机详细流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

还在用Jenkins?快来试试这款简而轻的自动部署软件!

最近发现了一个比 Jenkins 使用更简单的项目构建和部署工具&#xff0c;完全可以满足个人以及一些小企业的需求&#xff0c;分享一下。 Jpom 是一款 Java 开发的简单轻量的低侵入式在线构建、自动部署、日常运维、项目监控软件。 日常开发中&#xff0c;Jpom 可以解决下面这些…

吴恩达机器学习全课程笔记第五篇

目录 前言 P80-P85 添加数据 迁移学习 机器学习项目的完整周期 公平、偏见与伦理 P86-P95 倾斜数据集的误差指标 决策树模型 测量纯度 选择拆分方式增益 使用分类特征的一种独热编码 连续的有价值特征 回归树 前言 这是吴恩达机器学习笔记的第五篇&#xff0c…

《2023跨境电商投诉大数据报告》发布|亚马逊 天猫国际 考拉海购 敦煌网 阿里巴巴

2023年&#xff0c;跨境电商API接口天猫国际、京东国际和抖音全球购以其强大的品牌影响力和市场占有率&#xff0c;稳坐行业前三的位置。同时&#xff0c;各大跨境电商平台消费纠纷问题层出不穷。依据国内知名网络消费纠纷调解平台“电诉宝”&#xff08;315.100EC.CN&#xff…

javaEE--后端环境变量配置

目录 pre 文件准备 最终运行成功结果 后端运行步骤 1.修改setenv文件 2.运行setenv&#xff0c;设置环境变量 3.查看jdk版本 4.修改mysql文件夹下的my文件 前端运行步骤 1.nodejs环境配置 2.查看node和npm版本 3.下载并运行npm 4.注册登录 pre 文件准备 最终运行…

VR转接器:破解虚拟与现实边界的革命性设备

VR转接器&#xff0c;这一革命性的设备&#xff0c;为虚拟现实体验带来了前所未有的自由度。它巧妙地连接了虚拟与现实&#xff0c;使得用户在享受VR眼镜带来的奇幻世界的同时&#xff0c;也能自由地在现实世界中活动。这一设计的诞生&#xff0c;不仅解决了VR眼镜续航的瓶颈问…

GO结构体

1. 结构体 Go语言可以通过自定义的方式形成新的类型&#xff0c;结构体就是这些类型中的一种复合类型&#xff0c;结构体是由零个或多个任意类型的值聚合成的实体&#xff0c;每个值都可以称为结构体的成员。 结构体成员也可以称为“字段”&#xff0c;这些字段有以下特性&am…

STM32 | 零基础 STM32 第一天

零基础 STM32 第一天 一、认知STM32 1、STM32概念 STM32:意法半导体基于ARM公司的Cortex-M内核开发的32位的高性能、低功耗单片机。 ST:意法半导体 M:基于ARM公司的Cortex-M内核的高性能、低功耗单片机 32&#xff1a;32位单片机 2、STM32开发的产品 STM32开发的产品&a…

【论文笔记】Improving Language Understanding by Generative Pre-Training

Improving Language Understanding by Generative Pre-Training 文章目录 Improving Language Understanding by Generative Pre-TrainingAbstract1 Introduction2 Related WorkSemi-supervised learning for NLPUnsupervised pre-trainingAuxiliary training objectives 3 Fra…

Java 网络面试题解析

1. Http 协议的状态码有哪些&#xff1f;含义是什么&#xff1f;【重点】 200&#xff1a;OK&#xff0c;客户端请求成功。 301&#xff1a;Moved Permanently&#xff08;永久移除&#xff09;&#xff0c;请求的URL已移走。Response中应该包含一个Location URL&#xff0c;…

steam++加速问题:出现显示443端口被 vmware-hostd(9860)占用的错误。

目录 前言&#xff1a; 正文&#xff1a; 前言&#xff1a; 使用Steam对GitHub进行加速处理时&#xff0c;建议使用2.8.6版本。 下载地址如下&#xff1a;Release 2.8.6 BeyondDimension/SteamTools GitHub 下载时注意自己的系统位数 正文&#xff1a; 使用GitHub时会使…

NOC2023软件创意编程(学而思赛道)python初中组初赛真题

软件创意编程 一、参赛范围 1.参赛组别:小学低年级组(1-3 年级)、小学高年级组(4-6 年级)、初中组。 2.参赛人数:1 人。 3.指导教师:1 人(可空缺)。 4.每人限参加 1 个赛项。 组别确定:以地方教育行政主管部门(教委、教育厅、教育局) 认定的选手所属学段为准。 二、…

蓝桥杯Java B组历年真题(2013年-2021年)

一、2013年真题 1、世纪末的星期 使用日期类判断就行&#xff0c;这里使用LocalDate&#xff0c;也可以使用Calendar类 答案 2099 使用LocalDate import java.time.LocalDate; import java.time.format.DateTimeFormatter; // 1:无需package // 2: 类名必须Main, 不可修改p…

CentOS7 Hive2.3.8安装

CentOS7 Hive2.3.8 安装 建议从头用我的博客&#xff0c;如果用外教的文件到 一、9)步骤了&#xff0c;就用他的弄完&#xff0c;数据库不一样&#xff0c;在9步骤前还能继续看我的 一、 安装MySQL 0.0&#xff09;查询mariadb,有就去0.1&#xff09;&#xff0c;没有就不管…

python3装饰器

装饰器 它允许你修改函数或类的行为&#xff0c;而不更改其源代码。实质上&#xff0c;装饰器是接受另一个函数作为参数并返回一个包装原始函数的新函数。这样&#xff0c;你可以在不修改原始函数的情况下&#xff0c;添加一些额外的功能或逻辑。 def time_cost(func):"…

美团分布式 ID 框架 Leaf 介绍和使用

一、Leaf 在当今日益数字化的世界里&#xff0c;软件系统的开发已经成为了几乎所有行业的核心。然而&#xff0c;随着应用程序的规模不断扩大&#xff0c;以及对性能和可扩展性的需求不断增加&#xff0c;传统的软件架构和设计模式也在不断地面临挑战。其中一个主要挑战就是如…

学生云服务器_学生云主机_学生云数据库_云+校园特惠套餐

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

自注意力机制(Self-Attention)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站&#xff08;【http://www.aideeplearning.cn】&#xff09; Transformer模型中最关键部分就是自注意力&#xff08;Self-Attention&#xff09;机制&#xff0c;正如 Transformer 的论文的标题是“…

【Vue3】函数式编程(h 函数)

h 函数的原理就是 createVNode。可以使用 h 函数封装一些小组件。 <template><table border><tr><th>name</th><th>age</th><th>操作</th></tr><tr v-for"item in list" :key"item.age"&…