LogoLogo
github
  • 💪Upupup
  • React
    • hook
    • redux
    • Router
    • umimax+nest.js 实现 权限管理系统
    • umimax + Nest.js 实现权限管理系统
  • Vue
    • effectScope 是干啥的
    • Object.assign()
    • 响应式理解
    • @babel/preset-env 问题
    • 自定义指令
    • 问题及解决
    • 🧐权限管理(动态路由)
  • docker
    • Docker 常用命令
    • Docker部署遇到的问题
    • Docker Compose 常用命令
    • docker修改daemon.json
    • jenkins
    • Jenkinsfile 语法进阶
    • nginx配置
    • 问题
    • 玩转Nginx:轻松为Docker部署的服务添加域名的完美指南
    • Docker部署前后端项目:经验分享与问题解决
  • git
    • command
    • problem
    • rebase实践
  • 前端开发面试题集
    • CSS 面试题
    • 前端工程化面试题
    • HTML 面试题
    • JavaScript 面试题
    • NestJS 面试题
    • Node.js 面试题
    • 性能优化面试题
    • React 面试题
    • 安全面试题
    • Vue 面试题
  • interviewer
    • 计算机网络
    • 性能优化
  • leetcode
    • 算法
      • 分治算法
      • 滑动窗口与双指针
        • 🦸定长滑动窗口
        • 🚴不定长滑动窗口
        • 🚴‍♂️单序列双指针
      • 回溯
      • 二分法
  • nestjs
    • mail
    • mini-order
    • nestjs
    • prisma
    • 登录注册
  • nextjs
    • 用 V0 和 Cursor 实现全栈开发:从小白到高手的蜕变
  • tauri
    • 思路
    • 自动通知应用升级
  • vite
    • vite实现原理
  • webpack
    • 资料
  • 工具
    • Eslint
    • jenkins
    • 关于cicd
  • 微信小程序
    • ScoreDeck
    • h5跳转小程序问题
  • 思路
    • carTool
  • 操作系统学习
    • Linux命令
    • 计算机是如何计数的
    • nginx
      • location
      • try_files
  • 浏览器
    • session、location
    • web crypto
    • 性能监控和错误收集与上报
    • 预请求
  • 知识点整理
    • 知识点整理
  • 面试
    • Promise
    • 备战
    • 数码3
    • 腾娱
    • 腾讯云智
    • 重复请求合并
  • 前端工程化
    • 在 pnpm Monorepo 中使用公共方法包
由 GitBook 提供支持
在本页
  • 原理
  • 练习

这有帮助吗?

在GitHub上编辑
  1. leetcode
  2. 算法

分治算法

分而治之

原理

分(划分阶段) :递归的将原问题分解为两个或多个子问题,直至到达最小子问题时终止。

治 (合并阶段) : 从已知解的最小问题开始,从底至顶地将子问题的姐进行合并,从而构建出原问题的解。

练习

1.括号生成

数字 n 代表⽣成括号的对数,请你设计⼀个函数,⽤于能够⽣成所有可能的并且 有效的 括号组合
/**
 * @param {number} n
 * @return {string[]}
 * @param l 左括号已经⽤了⼏个
 * @param r 右括号已经⽤了⼏个
 * @param str 当前递归得到的拼接字符串结果
 * @param res 结果集
 */
const generateParenthesis = (n) => {
  const res = [];
  const dfs = (l, r, str) => {
    if (l === n && r == n) {
      return res.push(str);
    }
    if (l < r) {
      return;
    }
    if (l < n) {
      dfs(l + 1, r, str + "(");
    }
    if (r < n) {
      dfs(l, r + 1, str + ")");
    }
  };
  dfs(0, 0, "");
  return res;
};

const testAns = ["((()))", "(()())", "(())()", "()(())", "()()()"];

console.log(generateParenthesis(3)===testAns)

2.合并k个排序列表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

/**
 *
 * @param {number} val
 * @param {ListNode|null} next
 */
function ListNode(val, next) {
  this.val = val === undefined ? 0 : val;
  this.next = next === undefined ? null : next;
}

/**
 * 输入:lists = [[1,4,5],[1,3,4],[2,6]]
 * 输出:[1,1,2,3,4,4,5,6]
 * 解释:链表数组如下:
 * [1->4->5,1->3->4,2->6]
 * 将它们合并到一个有序链表中得到。
 * 1->1->2->3->4->4->5->6
 * @param {ListNode[]} lists
 * @return {ListNode}
 * https://leetcode.cn/problems/merge-k-sorted-lists/
 */
var mergeKLists = function (lists) {
  function dfs(i, j) {
    const m = j - i;
    if (m === 0) {
      return null;
    }
    if (m === 1) {
      return lists[i];
    }
    const left = dfs(i, i + (m >> 1));
    const right = dfs(i + (m >> 1), j);
    return mergeTwoLists(left, right);
  }
  return dfs(0, lists.length);
};
const mergeTwoLists = function (list1, list2) {
  const dummy = new ListNode();
  let cur = dummy;
  while (list1 && list2) {
    if (list1.val < list2.val) {
      cur.next = list1;
      list1 = list1.next;
    } else {
      cur.next = list2;
      list2 = list2.next;
    }
    cur = cur.next;
  }
  cur.next = list1 ? list1 : list2;
  return dummy.next;
};

3.二分查找

给定一个长度为 n 的有序数组 nums ,其中所有元素都是唯一的,请查找元素 target 。


const dfs = (nums, target, start, end) => {
  if (start > end) {
    return -1;
  }
  const m = start + ((end - start) >> 1);
  if (nums[m] < target) {
    return dfs(nums, target, m + 1, end);
  } else if (nums[m] > target) {
    return dfs(nums, target, start, m - 1);
  } else {
    return m;
  }
};
function binarySearch(nums, target) {
  const n = nums.length;
  return dfs(nums, target, 0, n - 1);
}

4.

上一页算法下一页滑动窗口与双指针

最后更新于5个月前

这有帮助吗?