
数据结构与算法
发量惊人
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
排列组合
全排列 function allPerm(arr) { var res = [] if(arr.length > 1) { //遍历每一项 for(let i = 0; i < arr.length; i++) { var left = arr[i] //拿到除了当前值的其他值 var rest = arr.slice(0,i).concat(arr.slice(i+1)) //上一次递归的全排列 var prePerm = allPerm(rest);原创 2020-08-18 00:32:21 · 187 阅读 · 0 评论 -
滑动窗口
一般有两个指针left和right,right用于向右移动扩大滑动区间,left向右移动缩小滑动区间(注意left和right的边界值) var minWindow = function(s, t) { //计算t中每个字符出现的次数 let obj = {} for(let i = 0; i < t.length; i++) { if(t[i] in obj) obj[t]++ else obj[t] = 1 } //滑动窗口的左右边界 var left = -1,原创 2020-08-17 23:54:56 · 166 阅读 · 0 评论 -
矩阵
螺旋遍历矩阵 /** * @param {number[][]} matrix * @return {number[]} */ var spiralOrder = function(matrix) { if(matrix.length == 0) return []; var dx = [0,1,0,-1]; var dy = [1,0,-1,0]; var m = matrix.length; var n = matrix[0].length; v原创 2020-08-16 18:34:44 · 134 阅读 · 0 评论 -
LeetCode——全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解析 (1)depth:递归到第几层 (2)path:已经选了哪些数 (3)vistied:记录这些数是否已经被选择 var permute = function(nums) { var res = [] var visited = Array(nums.length).fill(fal原创 2020-06-22 23:47:30 · 210 阅读 · 0 评论 -
LeetCode——多数之和
两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] var twoSum = function(nums, target) { for(let i = 0; i < n原创 2020-06-21 23:53:36 · 597 阅读 · 0 评论 -
leetcode——最长回文子串
题目 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: “babad” 输出: “bab” 注意: “aba” 也是一个有效答案。 示例 2: 输入: “cbbd” 输出: “bb” 中心扩散法 最长的回文子串的长度可以分为奇数个和偶数个。 遍历字符串中的每一个字符,假设该字符属于回文子串的中间项 回文子串的长度为奇数个时,判断i-1和i+1是否相等 假设回文子串的长度为偶数个时,判断i和i+1是否相等 function longesPalidro原创 2020-06-06 18:15:39 · 188 阅读 · 0 评论 -
leetcode——最小覆盖字串(滑动窗口)
题目 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 输入: S = “ADOBECODEBANC”, T = “ABC” 输出: “BANC” 说明: 如果 S 中不存这样的子串,则返回空字符串 “”。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 解析 新建对象obj记录t中每种字符串出现的次数,并记录t中的字符串种类数target var obj = {} for(let c of t){ if(c in obj) obj[c]+原创 2020-05-23 22:19:37 · 218 阅读 · 0 评论 -
leetcode——从先序遍历与中序遍历序列构造二叉树
题目 根据一棵树的前序遍历与中序遍历构造二叉树。 注意:你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 二叉树深度遍历 先序遍历:DLR 中序遍历:LDR 后序遍历:LRD 根据中序和先序遍历序列重构二叉树 由先序遍历特点可知,先序遍历第一个数据为根节点数据,则该二叉树的根节点值为preorder[0]=3 由中序遍历特点可知,根节点左边为左子树中序遍历结果,即[9]原创 2020-05-22 23:44:19 · 525 阅读 · 1 评论 -
leetcode——链表排序(插入排序)
插入排序:讲一个元素看做有序序列,其他元素看做无序序列,从无序序列中取出一个元素插入到有序序列中 时间复杂度 = O(n^2) 空间复杂度 = O(n) 题目: 使用插入排序对链表进行排序。 代码: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNo...原创 2020-04-06 18:24:17 · 221 阅读 · 0 评论 -
leetcode——链表排序(归并排序)
归并排序: (1)待排序的数组、链表从中间一分为二 (2)递归将左半部分进行归并排序 (3)递归将右半部分进行归并排序 (4)将左半部分和右半部分进行有序合并 分割次数 = log2^n 时间复杂度O(nlogn) 空间复杂度O(n) 题目: 在O(nlogn)的时间内使用常数级空间复杂度对链表进行排序。 解析: 时间复杂度为O(nlogn)的排序算法有归并排序和快排 归并排序的空间复杂度为O...原创 2020-04-06 16:23:36 · 286 阅读 · 1 评论 -
leetcode——逆波兰表达式
中缀表达式转逆波兰表达式:使用栈结构 规则: (1)运算符优先级 ( > * / > + - > ( (2)建立两个栈,分别是数字栈和运算符栈 (3)遇到数字压入数字栈 (4)遇到(或读取到的运算符 > 栈顶元素,压入运算符栈 (5)遇到)弹出运算符直到弹出( (6)新读取到的运算符<=栈顶元素,弹出所有>=新读取到的运算符的运算符,该运算符入栈 (7)读...原创 2020-04-03 22:11:44 · 300 阅读 · 0 评论 -
leetcode——求二叉树的最大(小)深度
最大深度:从根节点到叶子节点的最长路径上的节点个数 最大深度为3 规则: (1)二叉树为空,返回0 (2)递归计算左孩子和右孩子的深度,取最大值+1 代码实现 /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode righ...原创 2020-04-02 22:44:56 · 261 阅读 · 0 评论 -
二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 分析:使用递归将每一个节点的左右子节点进行交换 注意::不能只交换值,而应该交换结点,因为交换8的子节点6和10之后,8的左子树值变为了10,9,11,而不是10,5,7 代码实现 /* function TreeNode(x) { this.val = x; this.left = ...原创 2020-03-26 21:21:37 · 116 阅读 · 0 评论 -
剑指Offer——数的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 分析 这样的结构称为B是A的子结构。当A树和B树的某个节点值相等时,开始比较B树和A树的节点值是否相等,直到B的每个节点遍历结束都是相等的,则B是A的子结构。 注意:A树不一定只有一个值与B树根结点的值相等 代码 /* function TreeNode(x) { this.val = ...原创 2020-03-26 20:56:23 · 131 阅读 · 0 评论