Leetcode 343(Integer Break非动态规划求解)
2016-04-20 10:27
246 查看
问题
Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).
Note: you may assume that n is not less than 2.
Hint:
There is a simple O(n) solution to this problem.
You may check the breaking results of n ranging from 7 to 10 to discover the regularities.
分析
这道题一般会采用动态规划求解,可动态规划一是需要额外空间存储动态数组,二是需要给定初始条件和动态规划规则。我并没有使用动态规划的思想,二是考虑到,一个数拆分成若干个加数的乘积,这几个加数一定是非常接近的(差得绝对值小于1)。
举个反例,如果n=a+b+b+b+bn=a+b+b+b+b组成,其中a−b=2a-b=2, 那么a∗b∗b∗b∗ba*b*b*b*b一定不是最大的,因为(a−1)(b+1)=ab+(a−b−1)=ab+1>ab(a-1)(b+1)=ab+(a-b-1)=ab+1>ab。
所以解题思路为依次把 nn 分成 ii 份,那么每份为⌈ni⌉\lceil \frac{n}{i}\rceil 或者⌊ni⌋\lfloor\frac{n}{i}\rfloor, 计算完判断一下不同的数的差值,如果绝对值不小于1,则换另一种。将ii从22遍历到nn,选择最大的输出则是所求的结果。
class Solution { public: int integerBreak(int n) { int maxProduct=1; if(n==1) return 1; for(int i=2;i<=n;i++){ int divider=n/i; int remaining=n-divider*(i-1); if(remaining-divider>1||remaining-divider<-1){ divider++; remaining=n-divider*(i-1); } int product=pow(divider,i-1)*remaining; if(product>maxProduct){ maxProduct=product; } } return maxProduct; } };
时间复杂度为o(n)o(n), 空间复杂度为O(1)O(1).
相关文章推荐
- 双面材质
- 你应该更新的 Java 知识之常用程序库
- 《编程之美》——二叉搜索树转换为排序双向链表
- Android looper handler
- Android开发-API指南-<instrumentation>
- 算法Sedgewick第四版-第1章基础-019一Scanner的用法
- Makefile工具
- Java中的基础-----static关键字的作用
- Android应用启动优化:一种DelayLoad的实现和原理(上篇)(转载)
- MHX 存档修改工具 ver0.9.0.1
- 369Cloud升级全面解析
- 记两次面试经历-360与百度
- Java异常
- SASS用法指南
- C语言100个经典的算法
- eclipse 开发C/C++自动补全
- java国际化与ResourceBundle使用详解
- 前台页面 列表动态显示 加 子页面 脚本
- 前台页面 列表动态显示 加 子页面 脚本
- 前台页面 列表动态显示 加 子页面 脚本