JavaScript算法 + leetcode - 分而治之

556 阅读1分钟

本文记录分而治之的算法设计思想。

分而治之

  • 分而治之是算法设计中的一种方法。

  • 它将一个问题成多个和原问题相似的小问题,递归解决小问题,再将结果并以解决原来的问题。

使用场景

场景一:归并排序

  • 分:把数组从中间一分为二。

  • 解:递归地对两个子数组进行归并排序。

  • 合:合并有序子数组。

场景二:快速排序

  • 分:选基准,按基准把数组分成两个子数组。

  • 解:递归地对两个子数组进行快速排序。

  • 合:对两个子数组进行合并。

leetcode题目

难度:简单

374. 猜数字大小

226. 翻转二叉树

100. 相同的树

101. 对称二叉树

395. 至少有 K 个重复字符的最长子串

难度:困难

312. 戳气球

/**
 * @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)

总结

分而治之是将一个大问题分解为多个与原问题相似且独立的小问题,递归解决小问题,最后将小问题结果合并,则解决了原来的问题。