博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Optimal Division 最优分隔
阅读量:5121 次
发布时间:2019-06-13

本文共 2334 字,大约阅读时间需要 7 分钟。

 

Given a list of positive integers, the adjacent integers will perform the float division. For example, [2,3,4] -> 2 / 3 / 4.

However, you can add any number of parenthesis at any position to change the priority of operations. You should find out how to add parenthesis to get the maximum result, and return the corresponding expression in string format. Your expression should NOT contain redundant parenthesis.

Example:

Input: [1000,100,10,2]Output: "1000/(100/10/2)"Explanation:1000/(100/10/2) = 1000/((100/10)/2) = 200However, the bold parenthesis in "1000/((100/10)/2)" are redundant, since they don't influence the operation priority. So you should return "1000/(100/10/2)". Other cases:1000/(100/10)/2 = 501000/(100/(10/2)) = 501000/100/10/2 = 0.51000/100/(10/2) = 2

 

Note:

  1. The length of the input array is [1, 10].
  2. Elements in the given array will be in range [2, 1000].
  3. There is only one optimal division for each test case.

 

这道题给了我们一个数组,让我们确定除法的顺序,从而得到值最大的运算顺序,并且不能加多余的括号。刚开始博主没看清题,以为是要返回最大的值,就直接写了个递归的暴力搜索的方法,结果发现是要返回带括号的字符串,尝试的修改了一下,觉得挺麻烦。于是直接放弃抵抗,上网参考大神们的解法,结果大吃一惊,这题原来还可以这么解,完全是数学上的知识啊,太tricky了。数组中n个数字,如果不加括号就是:

x1 / x2 / x3 / ... / xn

那么我们如何加括号使得其值最大呢,那么就是将x2后面的除数都变成乘数,比如只有三个数字的情况 a / b / c,如果我们在后两个数上加上括号 a / (b / c),实际上就是a / b * c。而且b永远只能当除数,a也永远只能当被除数。同理,x1只能当被除数,x2只能当除数,但是x3之后的数,只要我们都将其变为乘数,那么得到的值肯定是最大的,所以就只有一种加括号的方式,即:

x1 / (x2 / x3 / ... / xn)

这样的话就完全不用递归了,这道题就变成了一个道简单的字符串操作的题目了,这思路,博主服了,参见代码如下:

 

解法一:

class Solution {public:    string optimalDivision(vector
& nums) { if (nums.empty()) return ""; string res = to_string(nums[0]); if (nums.size() == 1) return res; if (nums.size() == 2) return res + "/" + to_string(nums[1]); res += "/(" + to_string(nums[1]); for (int i = 2; i < nums.size(); ++i) { res += "/" + to_string(nums[i]); } return res + ")"; }};

 

下面这种解法的思路和上面基本相同,就是写法上略有不同,直接看代码吧:

 

解法二:

class Solution {public:    string optimalDivision(vector
& nums) { string res = ""; int n = nums.size(); for (int i = 0; i < n; ++i) { if (i > 0) res += "/"; if (i == 1 && n > 2) res += "("; res += to_string(nums[i]); if (i == n - 1 && n > 2) res += ")"; } return res; }};

 

参考资料:

 

转载于:https://www.cnblogs.com/grandyang/p/6886673.html

你可能感兴趣的文章
使用LSTM和Softmx来进行意图识别
查看>>
asp.net与oracle连接字符串
查看>>
opencv学习之路(4)、Mat类介绍,基本绘图函数
查看>>
POJ 1308
查看>>
Django+xadmin打造在线教育平台(二)
查看>>
BZOJ 4836: [Lydsy1704月赛]二元运算 分治FFT
查看>>
域名、网站名、URL
查看>>
Docker常用命令
查看>>
mysql几种存储引擎介绍
查看>>
转-Android客户端和服务端如何使用Token和Session
查看>>
IOS第14天(2, Modal控制)
查看>>
删除确认代码
查看>>
刻意练习
查看>>
学习笔记13_第三方js控件&EasyUI使用
查看>>
Java变量的初始化问题探究
查看>>
DSU on tree——令人惊叹的想法
查看>>
javascript 闭包
查看>>
约瑟夫环问题
查看>>
c++ __int64
查看>>
IP封锁 (防火墙维护一张IP黑名单)
查看>>