Leetcode 399. 除法求值

在这里插入图片描述

心路历程:

一开始看着挺蒙的主要是不知道这道题在考察哪个知识点,后来按顺序把三个示例自己模拟着做出来之后发现本质其实在考类似链表或者指针的东西。
再一想其实是一个树或者图的遍历搜索问题,一下子想到了回溯算法。
第一次遇到这个题从读题到最后AC一共用了17分钟。当时犹豫了很久除法溢出的问题,后来想想就算有溢出问题也可以用path存储一个路径再去乘法。但是其实这道题给float留的裕度很大,直接用path /= number也可以直接AC。

做完之后看网上的答案基本上也是按照图+DFS的思路来做的

注意的点:

1、注意回溯函数nonlocal的声明,因为有些变量不是List Objective
2、注意每次初始化回溯的几大参数(path, res, visited, flag)
3、初始化visited = [start]而不是[],由于回溯函数的循环不变量编程原则。

解法: 建图(树)+DFS

class Solution:
    def calcEquation(self, equations: List[List[str]], values: List[float], queries: List[List[str]]) -> List[float]:
        # 1. 建双向树 (其实是个图)
        element = {}
        for i in range(len(equations)):
            (x, y) = equations[i]
            if x not in element: element[x] = [(y, values[i])]
            else: element[x].append((y, values[i]))
            if y not in element: element[y] = [(x, 1.0 / values[i])]
            else: element[y].append((x, 1.0 / values[i]))
        # 2. 树的回溯函数
        def dfs(start, target):
            nonlocal path, visited, flag, res  # 2
            if start == target:
                flag = True
                res = path  # 3
                return
            candicate = element[start]
            for each in candicate:
                if each[0] not in visited:  # 这是一个能返回的树,所以必须用visited
                    visited.append(each[0])
                    path *= each[1]
                    dfs(each[0], target)
                    path /= each[1]  # ? 这道题没出现溢出问题
                    visited.pop()
        # 3. 回答问题
        ans = []
        for query in queries:
            (x, y) = query  # 解包
            if x not in element or y not in element: ans.append(-1)  # 根本没有这个元素
            else: # 注意初始化参数
                path, visited, flag, res = 1.0, [x], False, None  # 注意visited = [x] 循环不变量
                dfs(x, y)
                if flag: ans.append(res)
                else: ans.append(-1)
        return ans

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rocky(Centos)数据库等高并发或高io应用linux系统调优,及硬件问题排查(含网络、磁盘、系统监控)

一、系统参数优化 默认的最大打开文件数是1024.不满足生产环境的要求。按照如下配置: 1、修改 systemctl管理的 servie 资源限制 编辑/etc/systemd/system.conf # 全局的打开文件数 DefaultLimitNOFILE2097152 # 全局打开进程数 DefaultLimitNPROC655352、调整系…

[管理者与领导者-159] :社交策略和智慧-2,看破不说破,如何与虚伪的人和谐相处

目录 前言: 一、看破不说破 二、与虚伪的愉悦相处 三、如何利用社交技巧赞扬虚伪的人,而不失自己的原则 前言: 在实现生活中,总与遇到一种人,他们说一套,做一套、心理想一套,他们把自己利己…

面试-数据库基础以及MySql、ClickHost、Redis简介

面试-数据库基础以及MySql、ClickHost、Redis简介 0.数据完整性1.数据库并发控制1.1事物1.2 并发读写错误1.3 锁1.3.1 乐观锁与悲观锁1.3.2 共享锁和排他锁1.3.3 行锁与表锁1.3.4 意向锁 1.4 封锁协议与隔离级别1.5 MVCC1.5.1 概念1.5.2 当前读与快照读1.5.3 MVCC in InnoDB 2.…

数据采集仪:自动化监测系统的核心组件

在当代的工业自动化领域,数据采集仪成为了一个关键的技术工具,它不仅仅是简单地将电信号转化为数据信号,而是能够实时、有效地处理和显示各种信号,确保整个监测系统的稳定、高效运行。 点击输入图片描述(最多30字&…

redis-缓存穿透与雪崩

一,缓存穿透(查不到) 在默认情况下,用户请求数据时,会先在缓存(Redis)中查找,若没找到即缓存未命中,再在数据库中进行查找,数量少可能问题不大,可是一旦大量的请求数据&a…

自动化测试selenium(2)

目录 WebDriver介绍 WebDriver使用 使用WebDriver驱动操作浏览器(打开一个百度) WebDriver 相关API 定位元素 操作元素 上一篇主要介绍了自动化测试的概念以及selenium的基本原理, 这里我们来讲一下如何利用selenium来写测试用的脚本. WebDriver介绍 Selenium是一个用于…

GitHub repository - Branch - SSH clone URL - Clone in Desktop - Download ZIP

GitHub repository - Branch - SSH clone URL - Clone in Desktop - Download ZIP 1. Branch2. SSH clone URL3. Clone in Desktop4. Download ZIPReferences 1. Branch 显示当前分支的名称。从这里可以切换仓库内分支,查看其他分支的文件。 2. SSH clone U…

单细胞RNA测序(scRNA-seq)Cellranger流程入门和数据质控

单细胞RNA测序(scRNA-seq)Cellranger流程入门和数据质控 单细胞RNA测序(scRNA-seq)基础知识可查看以下文章: 单细胞RNA测序(scRNA-seq)工作流程入门 单细胞RNA测序(scRNA-seq)细胞分离与扩增 1. 单细胞RNA-seq样本数据说明 样本数据来源文章:Acquired cancer re…

Unity TextMeshProUGUI 获取文本尺寸·大小

一般使用ContentSizeFitter组件自动变更大小 API 渲染前 Vector2 GetPreferredValues(string text)Vector2 GetPreferredValues(string text, float width, float height)Vector2 GetPreferredValues(float width, float height) 渲染后 Vector2 GetRenderedValues()Vector…

自动化测试(selenium篇)

这次我们来介绍selenium 我们主要来讲解这几个要点 1.什么是自动化测试 2.什么是selenium 3.为什么来讲selenium 4.selenium的环境搭建 5.selenium的 API 1.什么是自动化测试 自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条…

快速掌握缓存技术:学习多个缓存供应商(ehcache,redis,memcached,jetcache,j2cache)

缓存技术 缓存模拟缓存Spring缓存技术第三方缓存技术Ehcache缓存供应Redis缓存memcached缓存(国内) jetcache缓存供应商jetcache的基本使用设置外部服务设置本地服务 jetcache方法缓存j2cache 缓存 什么是缓存 缓存是一种介于数据永久存储介质与数据应用…

【U8+】打开固定资产卡片提示:运行时错误‘91’,未设置对象变量或with block变量。

【问题描述】 用友U8软件,固定资产模中打开某张卡片后, 提示:运行时错误‘91’,未设置对象变量或with block变量。 Ps:但不是所有卡片打开的时候都会提示,有的正常。 【解决方法】 跟踪数据库后&#xff…

【高效开发工具系列】obsutil安装与使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

SpringBoot工程快速构建

一、构建流程 1.创建Maven项目 2.导入SpringBoot起步依赖 3.定义Controller 4.编写引导类 5.启动测试 二、使用idea快速构建 1.创建SpringBoot模块 2.勾选依赖 3.定义Controller 4.启动测试

Angular 使用DomSanitizer防范跨站脚本攻击

跨站脚本Cross-site scripting 简称XSS,是代码注入的一种,是一种网站应用程序的安全漏洞攻击。它允许恶意用户将代码注入到网页上,其他用户在使用网页时就会收到影响,这类攻击通常包含了HTML和用户端脚本语言(JS&…

【vue】用vite创建vue项目

前置要求 要有Node.js 1. 用vite创建vue项目 在cmd中,进入一个文件夹 在文件资源管理器上面的文件目录中,输入cmd,回车在cmd中通过cd命令进入对应文件夹 创建项目 npm create vitelatest # 创建项目创建项目过程中的一些选项 Ok to pro…

MyBatis源码介绍

文章目录 MyBatis的核心流程介绍SqlSessionFactory的理解MyBatis中的Executor的源码理解Spring中是如何解决MySQL的SqlSession的线程安全问题MyBatis面向Mapper编程工作原理Mybatis动态sql执行原理Mybatis的一级、二级缓存实现原理Mybatis的插件运行原理以及如何编写一个插件my…

【力扣】142. 环形链表 II

142. 环形链表 II 题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环&am…

Filebeat+Kafka+ELK 的服务部署

一. kafka 架构深入 1.1 Kafka 工作流程及文件存储机制 Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic 的。 topic 是逻辑上的概念,而 partition 是物理上的概念,每个 partit…

javaScript设计模式之简单工厂模式

简单工厂模式(Simple Factory):又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。 场景一 假设我们需要计算圆形和矩形的面积 function Circle(radius) {this.radius radius;}Circle.prototype.getArea function() {re…