算法设计与分析第二次作业

本文详细分析了LeetCode 241题,即根据给定的数字和运算符,找出所有可能的计算结果,并通过分治法优化了算法复杂度。同时,讨论了LeetCode 240题,介绍如何在一个有序二维矩阵中高效地搜索目标值,提出从矩阵左下角开始扫描的策略,显著降低了算法复杂度。
摘要由CSDN通过智能技术生成

leetcode 241

题目描述:Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are +, - and *.
Example 1:
Input: “2-1-1”
Output: [0, 2]
Explanation:
((2-1)-1) = 0
(2-(1-1)) = 2
Example 2:
Input: “2*3-4*5”
Output: [-34, -14, -10, -10, 10]
Explanation:
(2*(3-(4*5))) = -34
((2*3)-(4*5)) = -14
((2*(3-4))*5) = -10
(2*((3-4)*5)) = -10
(((2*3)-4)*5) = 10

题目要求找出一个计算式加括号后可以得到的所有结果,此问题的复杂性在于如果要考虑所有的可能性的话其复杂度是以阶乘向上增长的,有n个运算符的时候所有的可能性就有n!种,如果使用暴力穷举的话其运算量在运算符较多时就已经在一个很恐怖的数量级了,所以必须对其进行简化。其实很容易发现在这些阶乘的可能性中,其中存在大量的重复,不难看出所有的计算式都可以写成 (substring1)op(substring2) ( s u b s t r i n g 1 ) o p ( s u b s t r i n g 2 ) 这样的形式,而其实无论两个子字符串中的运算符的运算顺序是怎么样的,其实最终答案都是一样的,而暴力穷举的话这部分就造成了大量的重复,所以这样就可以想到这题可以用分治法进行处理,对于每一个运算符都以它为分隔符,然后分成左右两个部分࿰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值