本文记录分而治之的算法设计思想。
分而治之
-
分而治之是
算法设计
中的一种方法。 -
它将一个问题
分
成多个和原问题相似的小问题,递归解决
小问题,再将结果合
并以解决原来的问题。
使用场景
场景一:归并排序
-
分:把数组从中间一分为二。
-
解:递归地对两个子数组进行归并排序。
-
合:合并有序子数组。
场景二:快速排序
-
分:选基准,按基准把数组分成两个子数组。
-
解:递归地对两个子数组进行快速排序。
-
合:对两个子数组进行合并。
leetcode题目
难度:简单
难度:困难
/**
* @param {number[]} nums
* @return {number}
*/
var maxCoins = function(nums) {
if (!nums.length === 0) return 0;
nums = [1, ...nums, 1];
const len = nums.length;
let dp = Array.from(Array(len), n => Array(length).fill(0));
for (let i = len - 2; i >= 0; i--) {
for (let j = i + 2; j < len; j++) {
let max = 0;
for (let k = i + 1; k < j; k++) {
const temp = dp[i][k] + dp[k][j] + nums[i] * nums[j] * nums[k];
max = Math.max(temp, max);
}
dp[i][j] = max;
}
}
return dp[0][len - 1];
}
复杂度分析:
- 时间复杂度:O(n^3)
- 空间复杂度:O(n^2)
总结
分而治之是将一个大问题分解为多个与原问题相似且独立的小问题,递归解决小问题,最后将小问题结果合并,则解决了原来的问题。