剪绳子
给一根一段长度为n的绳子,请把绳子剪成m段,每一段绳子为k[0] k[1] … k[m],请问k[0]*k[1]…k[m]可能的乘积是多少? 例如长度为8的绳子,我们把它剪成长度为2 3 3的三段,此时得到的最大乘积是18。
思路
把长度为n的绳子剪成若干段后各段长度乘积,剪第一刀的时候,有n-1中可能的选择,也就是长度分别为1,2,…n-1,因此f(n) = max(f(i)*f(n-i)),其中0<i<n。
这样的话就是从上到下的递归公式,会产生很多重复的子问题,从而产生大量不必要的重复计算。更好的方式是通过从下到上的顺序计算, 也就是可以先得到f(2)、f(3),再得到f(4)、f(5),直到得到f(n)
代码
function maxProductAfterCutting_solution(length) {
if (length === 1) {
return 0;
}
if (length === 2) {
return 1;
}
if (length == 3) {
return 2;
}
const products = new Array(length + 1);
products[0] = 0;
products[1] = 1;
products[2] = 2;
products[3] = 3;
let max = 0;
for (let i=4; i <= length; i++) {
max = 0;
for (let j=1; j <= i/2; j++) {
let product = products[j] * products[i - j];
if (max < product) {
max = product;
}
products[i] = max;
}
}
max = products[length];
return max;
}
复杂度分析
- 时间复杂度: O(N*M)
- 空间复杂度: O(N)
FEATURED TAGS
前端开发
H5
JavaScript
设计模式
browser
jQuery
源码分析
生活
leetcode
Array
Stack
Queue
Linked List
剑指offer
Binary Search Tree
Binary Tree
Breadth-First Search
Depth-First Search
String
Set
Binary Search
Sliding Window
Backtracking
Dynamic Programming
Two Pointers
Union Find
Sort
Bit Operation
Recursion
Map
Graph
Search
Hash
LinkedList
复盘
QuickSort
Trie
Design
MinHeap
Traverse
Min Heap
Node.js
BackEnd
SQL
MySQL
Design Patterns
Network
计算机网络
Python
SVG