![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
文章平均质量分 54
Three_ST
学习者
展开
-
数据结构与算法之 leetcode 47. 全排列 II (回溯)
【代码】数据结构与算法之 leetcode 47. 全排列 II (回溯)原创 2024-06-17 18:40:52 · 228 阅读 · 0 评论 -
数据结构与算法之LeetCode-640. 求解方程(数学模拟)
- factor表示变量的系数,val表示常量值- 使用系数sign1表示默认系数,解析到等号时,说明解析到等式右边的项,令sign1 = -1- 使用sign2表示项的符号,初识时sign2 = sign1 。解析到‘+’,‘-’,要么相应的更改sign2,使用number记录数字,valid表示number是否有效- 如果解析到变量,那么相应的更改factor- 如果解析到的是常量项,那么相应的更改val- 如果factor=0,说明变量x对方程无影响,然后判断val=0 是否成立,成立则说明原创 2022-08-10 21:16:06 · 501 阅读 · 0 评论 -
数据结构与算法之LeetCode-1413. 逐步求和得到正数的最小值(贪心与排序)
贪心,排序原创 2022-08-09 21:04:29 · 1075 阅读 · 0 评论 -
数据结构与算法之LeetCode-1184. 公交站间的距离 - 力扣(LeetCode)
环形公交路线上有n个站,按次序从0到n - 1进行编号。我们已知每一对相邻公交站之间的距离,distance[i]表示编号为i的车站和编号为(i + 1) % n的车站之间的距离。环线上的公交车都可以按顺时针和逆时针的方向行驶。返回乘客从出发点start到目的地destination之间的最短距离。...原创 2022-07-24 10:42:05 · 185 阅读 · 0 评论 -
数据结构与算法之LeetCode-241. 为运算表达式设计优先级
一个整数区间[a, b](a < b) 代表着从a到b的所有连续整数,包括a和b。给你一组整数区间intervals,请找到一个最小的集合 S,使得 S 里的元素与区间intervals中的每一个整数区间都至少有2个元素相交。输出这个最小集合S的大小。......原创 2022-07-22 22:11:01 · 987 阅读 · 0 评论 -
数据结构与算法之leetcode-385. 迷你语法分析器 - 力扣使用递归和栈实现
385. 迷你语法分析器 - 力扣(LeetCode) (leetcode-cn.com)递归dfs判断开头的是否是’[’, ‘-’判断结束标志,以及是否嵌套数组var deserialize = function(s) { let index = 0; const dfs = (s) => { if (s[index] === '[') { index++; const ni = new NestedInte原创 2022-04-15 23:14:54 · 1045 阅读 · 0 评论 -
数据结构与算法之LeetCode-463-求解岛屿的周长 深度遍历(DFS)
463 岛屿的周长解题思路:使用深度遍历 DFS ,出现两种情况:遍历到的节点是网格边界节点,海洋的边界节点- 海洋的边界节点 grid[r][c]===0- 网格的边界节点 r<0||r>=grid.length||c<0||c>=grid[0].length将遍历过的陆地节点标记为2 grid[r][c]===2,防止重复计算var islandPerimeter = function(grid){ const n = grid.length; co原创 2022-04-05 19:55:12 · 201 阅读 · 0 评论 -
数据结构与算法之LeetCode-142-环形链表II(使用哈希和双指针求解)
142. 环形链表 II - 力扣(LeetCode) (leetcode-cn.com)哈希表保存遍历结果,如果出现相同的则返回var detectCycle = function(head){ const visited = new Set(); while(head!==null){ if(visited.has(head)){ return head; } visited.add(head); head = head.next; }原创 2022-03-22 23:23:56 · 1300 阅读 · 0 评论 -
数据结构与算法之LeetCode-31-下一个排列(使用字典序,什么是字典序)
31. 下一个排列 - 力扣(LeetCode) (leetcode-cn.com)字典序(dictionary order),又称 字母序(alphabetical order),原意是表示英文单词在字典中的先后顺序,在计算机领域中扩展成两个任意字符串的大小关系。/** * @param {number[]} nums * @return {void} Do not return anything, modify nums in-place instead. */var nextPermut原创 2022-03-13 09:55:54 · 220 阅读 · 0 评论 -
数据结构与算法之LeetCode-136-只出现一次的数字(位运算)
136. 只出现一次的数字 - 力扣(LeetCode) (leetcode-cn.com)题解考虑到题目要求时间具有线性时间复杂度,同时不用额外空间,想到了就在原数组上做操作:先排序,变成有序数组有序数组,按照题目条件,每个元素要么出现一次,要么出现两次出现两次的数字,在排序后会挨在一起取连续的两个数字,判断数字是否相等因为有可能取到最后的数组,就是一个奇数数组,因此就会是当前的结果如果出现一次的出现在中间就会是两个中的第一个数字/** * @param {number[]} nu原创 2022-03-09 21:42:05 · 1061 阅读 · 0 评论 -
数据结构与算法之LeetCode-10.10-数字流的秩(树状数组,什么是树状数组)
面试题 10.10. 数字流的秩 - 力扣(LeetCode) (leetcode-cn.com)var StreamRank = function() { this.arr = new Array(50001).fill(0);};/** * @param {number} x * @return {void} */StreamRank.prototype.track = function(x) { this.arr[x] += 1;};/** * @param {numb原创 2022-02-27 10:41:04 · 122 阅读 · 0 评论 -
数据结构与算法之LeetCode-300-最长递增子序列
300. 最长递增子序列 - 力扣(LeetCode) (leetcode-cn.com)动态规划两层遍历计算第二层遍历中是否增加/** * @param {number[]} nums * @return {number} */var lengthOfLIS = function(nums) { if(nums.length == 0){ return 0; } let dp = new Array(nums.length).fill(0); dp[0原创 2022-02-05 15:23:28 · 732 阅读 · 0 评论 -
数据结构与算法之LeetCode-二叉树遍历(JavaScript递归实现)
通过递归实现二叉树的遍历二叉树的前序/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right)原创 2021-12-08 23:11:41 · 735 阅读 · 0 评论 -
数据结构与算法之 Leetcode-1091-二进制矩阵中的最短路径
1091. 二进制矩阵中的最短路径BFS 广度优先遍历在用广度优先搜索的时候,脑海里面有一张如下的图:先把起始点加入到队列当中,最外层的while控制只要队列中有元素就一直循环取队头元素进行扩散第二个for循环(或者简写方法的while循环)主要是控制当前这一层的元素的扩散每次都是取队头元素进行扩散题目当中可以对当前元素的四面八方进行扩散,所以声明了一个directions数组方便循环扩散/** * @param {number[][]} grid * @return {numb原创 2022-01-28 10:38:47 · 1225 阅读 · 0 评论 -
数据结构与算法之LeetCode-15-三数之和
15.三数之和二分法 先确定一个初始位置再用下一个位置,与最后的位置开始二分搜索不断向中间搜索确定一个终止位置/** * @param {number[]} nums * @return {number[][]} */var threeSum = function(nums) { let ans = []; const len = nums.length; if(nums == null || len < 3) return ans; nums.so原创 2022-01-23 22:26:26 · 633 阅读 · 0 评论 -
数据结构与算法之LeetCode 844. 比较含退格的字符串
844. 比较含退格的字符串使用栈考虑题目要求遇到退格符号,就会删除前一个字符,一般想法是在下一个数字是退格符号时,将前一个符号从字符串中删除,这个时候想到可以使用栈这个结构来保存字符串。/** * @param {string} s * @param {string} t * @return {boolean} */var backspaceCompare = function(s, t) { return build(s)==build(t);};var build = f原创 2022-01-22 13:59:51 · 470 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(26)树的子结构-Java实现
题目26:树的子结构题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。题目分析: 1)先对A树进行遍历,找到与B树的根结点值相同的结点R; 2)判断A树中以R为根结点的子树是否包含B树一样的结构。代码实现:class TreeNode{ double val; TreeNode left = null; ...原创 2019-08-30 08:06:18 · 195 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(27) 二叉树的镜像-Java实现
第四章 解决问题的思路画图让抽象问题形象化题目27 二叉树的镜像题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像。解题思路:树的根节点相同,但它们的左右两个子节点交换了位置,交换了根节点后,还需要交换左右子节点1、先前序遍历这颗树的每个节点,2、如果遍历到的节点有子节点,就交换它的两个子节点。3、当交换万所有非子结点的左右字数后,就得到树的镜像代...原创 2019-08-30 23:04:58 · 108 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(28) 对称二叉树-Java实现
题目28:对称二叉树题目描述:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。解题思路:遍历过程中考虑空二叉树二叉树的前序遍历与对称前序遍历相同则是对称的代码实现 public boolean isSymmetrical(TreeNode root) { return isSymmetrical(root,root);...原创 2019-08-31 08:16:23 · 98 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(29) 顺时针打印数组-Java实现
题目29:顺时针打印数组题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。题目分析:利用图形思考,得出循环条件是columns>start*2并且rows>startY*2代码实现:package swordToOffer;public class Num29_PrintMartixClockwise { //输入一个矩阵,按照从...原创 2019-09-29 10:15:57 · 141 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(6)重建二叉树-Java实现
题目6:重建二叉树题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6},则重建出其二叉树并输出它的头结点。解题思路:在二叉树的前序遍历序列中, 第一个数字总是树的根节点的值,在中序遍历...原创 2019-08-19 16:04:24 · 88 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(25)合并两个排序链表-Java实现
题目25:合并两各排序链表题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。解题思路:容易犯的两种错:1、写代码之前可以想清楚合并的过程;2、代码在鲁棒性上存在问题 合并从两个链表的头节点开始。小的节点放在前面,剩下的链表任然是排序的,因此合并步骤是一样的 需要对空链表单独处理(链表1或者链表2为空指针的时候,输出链表2和链表1)...原创 2019-08-29 00:09:14 · 155 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(24)反转链表-Java实现
题目24:反转链表题目描述:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。解题思路:为了避免链表在节点i处断裂,需要在调整节点i的next指针前,把节点j保存下来,也就是在调整i的next指针时,除了需要知道i本身,还需要直到i的前一个节点h,定义三个指针,分别指向当前遍历到的节点、它的前一个节点、后一个节点。 接着试着找到反转后的头节点。代码实现:...原创 2019-08-27 23:07:51 · 110 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(19)正则表达式匹配-Java实现
题目19:正则表达式匹配题目描述:请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"及"ab*a"均不匹配。解题思路:每次从字符串中拿出一个字符和模式中的字符去匹配,...原创 2019-08-23 22:21:02 · 132 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(9)斐波那契数列(Fibonacci)-青蛙跳台问题-Java实现
递归与循环在函数求解中会经常使用,但是各自有各自的优缺点递归:代码小,但是不优化的话时间空间占用较大题目9:斐波那契数列问题描述:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。解题思路:常规解法,按照递推公式,f(n) = f(n-1)+f(n-2)实现递归,但是会出现就很多重复计算节点; 实用解法:将计算的的结果保存下来,下次计算时调用即可; ...原创 2019-08-20 10:38:05 · 190 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(8)用两个栈实现队列-Java实现
栈是常见的数据结构,比如说操作系统会给每个线程创建一个栈用来存储函数调用时的各个函数的参数,返回地址及临时变量;栈的特点是先进后出(FILO),栈不考虑排序,需要O(n)找到最大或者最小的数;队列的特点是先进先出,即第一个进入队列的元素将会第一个出来。题目8:用两个栈实现队列题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHe...原创 2019-08-20 08:56:28 · 130 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(7)二叉树的下一个节点-Java实现
题目7 二叉树的下一个节点题目描述: 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。题目分析:若一个节点有右子树,那么它的下一个节点就是它的右子树中最左节点,也就是从右子节点出发一直沿着指向左子节点; 若一个节点没有右子节点,同时它是父节点的左子节点,那么它的下一节点就是父节点; ...原创 2019-08-22 23:46:33 · 110 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(5)从头到尾打印链表-Java实现
题目6:从头带我打印链表题目描述:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。节点如下定义:解题思路:遍历是从头到尾,但是输出是从尾到头,也就是第一个遍历的节点最后输出,最后一个节点第一个输出,典型的“后进先出-LIFO“,可以用栈实现这种顺序。每经过一个节点的时候,把该节点放到一个栈中,当遍历完整个链表后,再从栈顶输出每个节点的值。代码如下: public ...原创 2019-08-19 14:59:13 · 125 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(4)替换空格-Java实现
处理字符串的问题题目4:替换空格题目描述:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。算法思想:1、如果 从前往后,每次扫描到一个空格,替换为%20的话,那么每次替换后数组都要往后移位(O(n^2));2、先遍历一次数组,统计出字符串中的空格总数,每替换一个空格,长度增加2,因此...原创 2019-08-19 13:39:38 · 105 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(3)二维数组中的查找-Java实现
题目3:二维数组中的查找题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路:首先选取数组中右上角的数字,如果该数字等于要查找的数组, 则查找过程结束; 如果该数字大于要查找的数字,则删除这个数字所在的列; 如果该数字小于要查找的数字,则剔除这个数...原创 2019-08-19 11:28:52 · 81 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(2)不修改数组找出重复的数字-Java实现
题目2-不修改数组找出重复的数字描述:在一个长度为n+1的数组里的所有数字都在1到n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为8的数组{2, 3, 5, 4, 3, 2, 6, 7},那么对应的输出是重复的数字2或者3。思路:1、使用辅助数组实现上面的功能,但是需要额外的空间O(n),数组下标与数字对应。...原创 2019-08-19 10:31:11 · 171 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(10)旋转数组的最小数字-Java实现
查找和排序查找和排序在程序设计中经常用到,如果遇到在排序数组或者(部分排序数组)中查找一个数字 或者统计某个数字出现的次数,那么可以尝试二分查找。哈希表主要优点能够在O(1)的时间内找到某一元素;排序较查找复杂一些,常用的排序算法总结,可以查看我的另一篇 数据结构与算法之常用排序算法-Java JavaScript实现题目11:旋转数组的最小数字题目描述:把一个数组最开始的...原创 2019-08-20 13:44:55 · 120 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(11)矩阵中的路径-Java实现
回溯法:可以看做蛮力法的升级版,他从解决问的每一步所有可能系统的选择一个可行的方法,回溯法适合多个步骤组成的问题,并且每个步骤有多个选项,当我们在某一步选择了其中一个选项 时,就进入下一步,然后又面临新的选择,如此重复,直到达到最终状态。回溯法可能解决问题的可能可以用树状结构表示。题目11:矩阵中的路径题目描述:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字...原创 2019-08-20 15:20:43 · 95 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(20)表示数值的字符串-Java实现
题目19:表示数值的字符串题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。题目分析:表示数字的字符串遵循模式A[.[B]][e|EC]或者.B[e|EC],其中A为数值的整数部...原创 2019-08-24 11:59:25 · 208 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(18)删除链表的重复节点-Java实现
题目18:删除链表中的重复的节点题目描述:在一个排序的链表中,如何删除重复的节点?解题思路:第一步确定是删除函数的参数,这个函数需要输入待删除链表的头节点,头结点可能与后面的节点重复,也就是说头结点也可能被删除,因此删除函数声明DeleteDuplicatedNode(ListNode pHead) 接下来遍历整个链表,如果当前节点(pNode)的值与下一个节点值相同,那么它就是...原创 2019-08-23 13:32:40 · 118 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(16)打印从1到最大的0位数 -Java实现
题目16:打印从1到最大的n位数题目描述: 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。题目分析:跳进面试官的陷进:利用for循环从1到n输出:在字符串上模拟数字加法的解法:模拟一个大叔最容易想到的是使用字符串或者数组表示大数。一是在字符串表达的数字上模拟加法; 二是把字符串表达的数字打印出来把问题转换成数...原创 2019-08-22 23:46:08 · 87 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(15)数值的整数次方 -Java实现
高质量的代码代码的规范性:清晰地书写、清晰地布局、合理的命名 代码的完整性:功能测试、边界测试、负面测试第15题 数值的整数次方题目描述:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。题目分析:自以为简单的解法:直接不考虑边界输出(输入的指数小于0或者为负数)...原创 2019-08-22 22:36:28 · 112 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(14)二进制中的1的个数-Java实现
位运算位运算就是把数字用二进制表示之后,对每一位上的0或者1的运算。与(&) 0&0=0 0&1=0 1&1=1 或(|) 0|0=0 1|0=1 1|1=1 异或(^) 1^0=1 0^1=1 1^1=0 题目14:二进制中1的个数题目描述:请实现一个函数,输入一个整数,输出该数二进...原创 2019-08-21 22:56:08 · 142 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(22)链表中倒数第K个节点-Java实现
代码的鲁棒性Robust-程序能够判断输入是否合乎规范要求,并对不符合要求的输入予以合理的处理容错性是鲁棒性的一个重要体现提高鲁棒性的有效途径是进行预防性编程-指预见在什么地方会出现问题。题目22:链表中倒数第K个节点题目描述:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点...原创 2019-08-25 23:37:52 · 138 阅读 · 0 评论 -
数据结构与算法-剑指Offer系列(21)调整数组顺序使奇数位于偶数前面-Java实现
题目21调整数组顺序使奇数位于偶数前面题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。解题思路:不考虑时间复杂度,最简单的思路是从头到尾扫描数组,每碰到一个偶数拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪动后数组末尾存在一个空位。这个时候把该偶数放入这个空位,由于碰到一个偶数需要移动O(...原创 2019-08-25 22:52:21 · 242 阅读 · 0 评论