241. 为运算表达式设计优先级【C++/力扣/详解】分治法例题1

本文详细解析LeetCode的241题,通过分治算法设计一个C++解决方案,探讨如何处理运算表达式的括号排列以确定所有可能的结果。内容包括递归思想的应用和代码实现。
摘要由CSDN通过智能技术生成

题目

在这里插入图片描述

题解

部分内容转载于leetcode-分治-241——为运算表达式设计优先级

  • 这道题是为了巩固算法设计与分析中学到的第一种具体的算法思想,即递归与分治在这里插入图片描述
    递归与分治在这里插入图片描述
    这道题就满足使用条件,这是因为(以下为对转载内容的分析):
    在这里插入图片描述
  • 【divide】对于一个给定的算术表达式a op b,结果就是因为括号顺序的改变而得到的所有不同的a的值和b的值进行op运算所得到的值。比如左边假设可以变化为a1,a2,右侧可以变化为b1,b2,b3,这个时候我们就可以说整个表达式的可能取值就是,a1b1,a1b2,a1b3,a2b1,a2b2,a2b3,这样我们就得到了部分的答案取值。比如我们先看第一组,即乘号作为这个式子的分割,左边的2就是a,右边的(3-45)就是b,因为a和b中我们可以在不同的地方加括号,就会导致a和b的值发生变化,左边只有一个数2,它再怎么加括号,都只能是2了,那么左边就只有一个a1,a1就是2,而右边,就会因为加括号的方式不同,产生不同的结果,在这里插入图片描述
    如图,乘号右边有2种加括号的方式,会有2种不同的结果,于是乘号右边就是有b1,b2这两种取值(我们就认为取值都会不同先不判断),之后整个表达式他问可能结果的组合,其中就会有2种组合,a1
    b1和a1*b2。之后我们就可以把这两种组合得到的结果加进结果数组中。
  • 【conquer】分解成运算符左边和右边之后,我上面是手动计算出来的左边有1种可能,右边有2种可能,但是式子一长,比如右边还有10000个字符的表达式,这怎么办,我手动算不出来,就用计算机的递归,你会发现,这道题的问题是求一个表达式,加不同的括号之后,所能得到的所有的结果是多少,之后返回一个数组。你再看看刚才的分析过程,我们找op右边的b1,b2…的过程,不就是找op这个运算符右边这个子表达式,它加不同的括号之后,得到的所有不同的结果吗,每一个结果就是对应的b1,b2。到这里就可以看出来,最大的问题是求整个
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值