【分治算法】运算的优先级

最典型的回溯算法就是归并排序,核心逻辑如下:

public void sort(int[] nums, int lo, int ho){int mid = (lo + hi) / 2;//对数组的两部分分别排序sort(nums,lo, mid);sort(nums, mid+1,hi);//合并两个排好序的子数组merge(nums, lo, mid, hi);
}

添加括号的所有方式

在这里插入图片描述
你输入一个算式,你可以给它随意加括号,请你穷举出全部所有的可能的加括号的结果。

List<Integer> diffWaysToCompute(String input);

解决办法的关键有两点:
1.不要思考整体,而是要目光聚焦局部,只看一个运算符
2.明确递归函数是什么,并且相信函数的定义
例如我们输入一个算式:

1 + 2 * 3 - 4 * 5

我们思考只加一层括号,有几种加括号方式

(1) + (2 * 3 - 4 * 5)(1 + 2) * (3 - 4 * 5)(1 + 2 * 3) - (4 * 5)(1 + 2 * 3 - 4) * (5)

发现规律了吗,我们其实就是按照运算符进行分隔,并且给每个运算符的左右加括号。

仔细分析

(1 + 2 * 3) - (4 * 5)

我们用-号进行分隔,把原算式分隔为两个算式

1 + 2 * 3

4 * 5

分治算法这一步就是将原问题进行分解了,我们现在要【治】了

1 + 2 * 3 

可以有两种加括号的方式,分别是

(1) + (2 * 3) = 7

(1 + 2) * (3) = 9

所以我们可以将这个数据写成

[7,9]

4*5只有一个数字,那就是

[20]

所以 (1 + 2 * 3) - (4 * 5) 有两种结果,分别是

9 - 20 = -11

7 - 20 = -13

那么,对于 (1 + 2 * 3) - (4 * 5) 这个例子,我们的计算逻辑其实就是这段代码:

List<Integer> diffWaysToCompute("(1 + 2 * 3) - (4 * 5)") {List<Integer> res = new LinkedList<>();/****** 分 ******/List<Integer> left = diffWaysToCompute("1 + 2 * 3");List<Integer> right = diffWaysToCompute("4 * 5");/****** 治 ******/for (int a : left)for (int b : right)res.add(a - b);return res;
}

diffWaysToCompute函数是计算当前输入的函数可以得到的函数值。

public List<Integer> diffWaysToCompute(String input){List<Integer> res = new LinkedList<>();for(int i = 0; i < input.length(); i++){char c = input.chatAt(i);if(c == '-' || c == '*' || c == '+'){List<Integer> left = diffWaysToCompute(input.substring(0,i));List<Integer> right = diffWaysToCompute(input.substring(i+1));// 通过子问题的结果,合成原问题的结果for (int a : left)for (int b : right)if (c == '+')res.add(a + b);else if (c == '-')res.add(a - b);else if (c == '*')res.add(a * b);}}if (res.isEmpty()) {res.add(Integer.parseInt(input));}return res;
}

扫描输入的算式input,每当遇到输入的运算符号就进行分隔,递归结果计算出来后,根据运算结果来合并结果。

当然,还有一个重点的函数

// base case
// 如果 res 为空,说明算式是一个数字,没有运算符
if (res.isEmpty()) {res.add(Integer.parseInt(input));
}

递归函数需要一个base case用来结束递归,代表着你分到什么时候可以开始归一。当算是中不存在运算符的时候,就可以结束了。

总结

解决上述算法题利用了分治思想,以每个运算符作为分割点,把复杂问题分解成小的子问题,递归求解子问题,然后再通过子问题的结果计算出原问题的结果。

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

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

相关文章

uniapp 用于开发H5项目展示饼图,使用ucharts 饼图示例

先下载ucharts H5示例源码&#xff1a; uCharts: 高性能跨平台图表库&#xff0c;支持H5、APP、小程序&#xff08;微信小程序、支付宝小程序、钉钉小程序、百度小程序、头条小程序、QQ小程序、快手小程序、360小程序&#xff09;、Vue、Taro等更多支持canvas的框架平台&#…

企业电子招标采购系统源码Spring Cloud + Spring Boot + 前后端分离 + 二次开发

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

sqlserver dba日常操作

文章目录 查询慢sql的方法sqlserver备份全备差异备日志备ldf备份事务备份 注意事项SQL Server 还原全备还原差异备份还原日志备/尾日志还原事务日志还原备份还原中的问题还原失败&#xff0c;需要某些权限重命名sql Server数据库名称失败 作业迁移单个迁移批量迁移 登陆账号迁移…

PHP-PhpSpreadsheet导出带图片方法

需求描述 导出表格&#xff0c;项目名称对应项目详情页面二维码。 实现方法 1&#xff0c;先将各个项目生成的二维码存放到了一个指定目录里面&#xff1b; 2&#xff0c;导出数据到excel表格 <?phpuse PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpread…

Linux Centos 配置 Docker 国内镜像加速

在使用 Docker 进行容器化部署时&#xff0c;由于国外的 Docker 镜像源速度较慢&#xff0c;我们可以配置 Docker 使用国内的镜像加速器&#xff0c;以提高下载和部署的效率。本文将介绍如何在 CentOS 系统上配置 Docker 使用国内镜像加速。 步骤一&#xff1a;安装 Docker 首…

视频推拉流EasyDSS互联网直播/点播平台构建户外无人机航拍直播解决方案

一、背景分析 近几年&#xff0c;国内无人机市场随着航拍等业务走进大众&#xff0c;出现爆发式增长。无人机除了在民用方面的应用越来越多&#xff0c;在其他领域也已经开始广泛应用&#xff0c;比如公共安全、应急搜救、农林、环保、交通 、通信、气象、影视航拍等。无人机使…

【C盘清理】Jetbrains全家桶(PyCharm、Clion……)更改 IDE 特定文件(配置、缓存、插件、日志等)存储位置

文章目录 一、官网说明二、更改 IDE 目录的位置1. 转到“帮助”|“编辑自定义属性”2. 各文件位置3. 以PyCharm系统目录为例4. 修改idea.properties 三、清理旧的 IDE 目录 一、官网说明 IDE 使用的目录官网说明 二、更改 IDE 目录的位置 默认情况下&#xff0c;PyCharm 将每…

硬件基础-二极管

3.二极管 正偏时是多数载流子载流导电&#xff0c;反偏时是少数载流子载流导电。所以&#xff0c;正偏电流大&#xff0c;反偏电流小&#xff0c;PN 结显示出单向电性。多数载流子正向通过 PN 结时就需要克服内电场的作用&#xff0c;需要约 0.7 伏的外加电压&#xff0c;这是…

Pytorch神经网络的参数管理

目录 一、参数访问 1、目标参数 2、一次性访问所有参数 3、从嵌套块收集参数 二、参数初始化 1、内置初始化 2、自定义初始化 3、参数绑定 在选择了架构并设置了超参数后&#xff0c;我们就进入了训练阶段。此时&#xff0c;我们的目标是找到使损失函数最小化的模型参数…

原来Python的协程有2种实现方式

什么是协程 在 Python 中&#xff0c;协程&#xff08;Coroutine&#xff09;是一种轻量级的并发编程方式&#xff0c;可以通过协作式多任务来实现高效的并发执行。协程是一种特殊的生成器函数&#xff0c;通过使用 yield 关键字来挂起函数的执行&#xff0c;并保存当前的执行…

APM固件编译和仿真

事情起因 主要想对无人机APM固件进行仿真的算法验证&#xff0c;因实际飞行的过程实际验证太浪费飞机了&#xff0c;所以就先试用仿真对算法进行仿真开发。 一&#xff0c;环境搭建 环境搭建我建议参考官方英文教程&#xff0c;英文教程写的比较全&#xff0c;不懂可以自己使…

智能 GPT 图书馆又重生了

智能 GPT 图书馆又重生了 作者&#xff1a;程序员小白条 1&#xff09;概述 自从大二寒假准备开始筹备这个项目&#xff0c;到现在已经一年了&#xff0c;这个项目能维护一年&#xff0c;不愧是我.jpg。本来这个项目只是想练练手&#xff0c;因为那时候刚学完 Spring Boot2 V…

如何将门脸图片文字识别为excel表格数据?

对于市场调查人员而言&#xff0c;最烦的事莫过于对路边的小店进行逐一记录了&#xff0c;有没有效率高点的办法&#xff0c;不用人工录入呢&#xff1f;我来告诉你一个秘密&#xff1a;先将小店的牌子&#xff08;门脸&#xff09;拍下来&#xff0c;然后用OCR软件批量转成exc…

安卓自动化 APP:轻松关闭任意开屏广告 | 开源日报 No.116

gkd-kit/gkd Stars: 8.7k License: GPL-3.0 基于无障碍 高级选择器 订阅规则的自定义屏幕点击 APP&#xff0c;主要功能包括实现跳过任意开屏广告、关闭应用内部弹窗广告以及一些快捷操作&#xff0c;如微信电脑登录自动同意和领取红包等。其核心优势和特点包括&#xff1a;…

SpringBoot Whitelabel Error Page 报错--【已解决】

springboot 报错信息如下 这个报错页面就是个404 &#xff0c;代表你访问的url 没有对应的的requestmapping 其实没啥影响的一个问题&#xff0c;但是看到Error 就是不爽&#xff0c;改了他丫的 解决方法如下 一、调整application.properties配置【治标不治本】 server.err…

JVM虚拟机运行时数据区程序计数器和元空间和线程控制块

阅读前提是对虚拟机有一定的理解 文章目录 阅读前提是对虚拟机有一定的理解16.堆、(方法区)元空间、虚拟机栈、程序计数器、本地方法栈16.1每个线程私有pc、vms、nms,共享 堆和堆外空间&#xff08;元空间等&#xff09; 1.虚拟机中运行时数据区中的方法区被元空间取代2. 用于存…

Jmeter自动判定运行结果(断言)

大家知道在jmeter中如果要查看运行结果可以通过添加监听器里面的查看结果树进行验证&#xff0c;但是这种方式查看结果依然是通过人眼进行比对的&#xff0c;为了能够解放双眼&#xff0c;可以通过jmeter自带的断言功能进行结果的自动判定&#xff0c;这样也算是进行一个简单的…

Apache Seatunnel本地源码构建编译运行调试

Apache Seatunnel本地源码构建编译运行调试 文章目录 1. 环境准备1.1 Java环境1.2 Maven1.3 IDEA1.4 Docker环境1.5 Mysql8.0.281.6 其它环境准备 2. 源码包下载3. idea项目配置3.1 项目导入3.2 maven配置3.3 项目JDK配置3.4 项目启动参数配置3.4.1 seatunnel项目启动参数配置3…

Qt之使用QListView加载相册(富文本ToolTip)

一.效果 二.实现 #include "mainwindow.h" #include "ui_mainwindow.h"#include <QStandardItemModel> #include <QFont>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);QFont…

内衣洗衣机好用吗?专门洗内衣内裤的热门小型洗衣机

随着人们的生活水平的提升&#xff0c;越来越多小伙伴来开始追求更高的生活水平&#xff0c;一些智能化的小家电就被发明出来&#xff0c;而且内衣洗衣机是其中一个。现在通过内衣裤感染到细菌真的是越来越多&#xff0c;所以我们对内衣裤的清洗频次会高于普通衣服&#xff0c;…