算法
霜霖❀
保持热爱,永远在路上。
展开
-
【算法】滑动窗口
常见的滑动窗口算法原创 2022-09-18 21:35:25 · 405 阅读 · 1 评论 -
【leetcode】打家劫舍
打家劫舍原创 2022-07-03 22:42:20 · 157 阅读 · 0 评论 -
【leetcode】分割等和子集
分割等和子集原创 2022-07-03 20:57:11 · 120 阅读 · 0 评论 -
【算法】检查括号是否成对出现
检查括号是否成对出现原创 2022-07-03 20:51:37 · 569 阅读 · 0 评论 -
【Leetocode】买卖股票
leetcode买卖股票算法通解系列原创 2022-06-30 21:02:52 · 89 阅读 · 0 评论 -
【算法】01.链表
常见链表算法题原创 2022-06-07 21:49:53 · 239 阅读 · 0 评论 -
【剑指offer】23.链表中环的入口结点
题目给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。要求:空间复杂度 O(1),时间复杂度 O(n)例如,输入{1,2},{3,4,5}时,对应的环形链表如下图所示:可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。快慢指针题解假设有两个指针fast和slow初始都指向head,fast每次走两步,slow每次走一步,若该链表存在环,则slow和fast则必会相遇假设第一次相遇时,slow走了k步,则fast因为速度是slow的2倍则会走2k步,原创 2022-05-18 22:50:54 · 148 阅读 · 0 评论 -
【剑指offer】26.树的子结构
题目: 输入两棵二叉树A和B,判断B是不是A的子结构(不是子树)。(约定空树不是任意一个树的子结构)。B是A的子结构, 即 A中有出现和B相同的结构和节点值。输入:A = [3,4,5,1,2], B = [4,1]输出:true返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。解法一: 递归想法,只要A的左右子树含有B就行。而当递归到A的某个子树结构A'的根节点和B的根节点重合时,这时候就需要判断A'和B是否结构相同var isSubStructure = function原创 2022-04-27 17:14:54 · 943 阅读 · 0 评论 -
【剑指offer】49.丑数
题目: 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第 n个丑数。示例:输入:7返回值:8输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。题解一: 首先由丑数的定义可以写出一个函数判断是否是丑数,然后依次计数到n。但是这种方法是暴力破解,当n=1500时,牛客就显示运行超时function原创 2022-04-26 17:40:15 · 190 阅读 · 0 评论 -
【剑指offer】36.二叉搜索树与双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。解法: 由二叉搜索树数转换成一个排序的双向链表,因为二叉搜索树的特性(左子树小于根节点,右子树大于根节点)很自然就想到对其做一个中序遍历就能得到一个从小到大排序的链表,而双向链表则需要将前驱节点的right指针指向后驱节点,后驱节点的left指针指向前驱节点,因此在递归中序遍历时需要改变一下指针的指向。let head=null;let pre=null;function Convert(pRootOfTree){ //原创 2022-04-21 11:01:32 · 520 阅读 · 0 评论 -
【剑指offer】76.删除链表中重复的结点
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5示例:输入:{1,2,3,3,4,4,5}返回值:{1,2,5}解法: 想法很简单就是重建一个指针,在遍历原排序的链表时遇到重复的直接跳过,主要考虑到以下特殊情况function deleteDuplication(pHead){ //4.空链表 i原创 2022-04-20 13:08:23 · 102 阅读 · 0 评论 -
【剑指offer】48. 最长不含重复字符的子字符串
题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例:输入:"abcabcbb"返回值:3(abc)输入:"bbbbb"返回值:1(b)输入:"pwwkew"返回值:3(wke)解法1: 想法很简单,依次遍历字符串,用str来保存当前位置i之前的最长不重复子串,如果字符s[i]在之前遍历的字串str中没有出现,则str将该s[i]拼接到末尾,反之str则进行更新,将s[i]这个字符在str出现位置到i之间的字符子串,并且每次都比较一下str长度和之原创 2022-04-19 13:58:15 · 131 阅读 · 0 评论 -
【剑指offer】62.判断是不是平衡二叉树
题目:输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。示例:输入:{1,2,3,4,5,6,7}返回值:true输入:{}返回值:true思路: 这道题首先要明确平衡二叉树是只要满足两个条件中其中之一就行,第一是空树,第二是左右子树高度差不超过1,原创 2022-04-12 19:12:52 · 157 阅读 · 0 评论 -
【剑指offer】65.不用加减乘除做加法
题目: 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路: 这道题真有意思,拿到手的时候虽然有想到用二进制来算,但是还是想不到很透彻,看了官方解法真的不得不惊叹大佬们的智慧首先我们知道两个数相加分为两个步骤,首先是不带进位的相加,然后把第一步相加结果和进位再相加得到最后的运算结果先看第一步不带进位的相加,在二进制中,可得出1+1=0, 1+0=1, 0+1=1,0+0=1,这很明显可以得出是异或(^)操作而第二步可从下面表格看出进位结果是按位与(&)的操作原创 2022-03-29 20:11:59 · 508 阅读 · 0 评论 -
【剑指offer】11.旋转数组的最小数字
题目:有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。示例:输入:[3,4,5,1,2]返回值:1思路: 采用二分法进行查找,首先如果first指针所指向的数大于mid指针所指向的数,则说明mid在第二个递增序列中,最小目标值在前半截需要将mid赋值给last如果first指针所指向的数原创 2022-03-29 19:47:50 · 516 阅读 · 0 评论 -
【剑指offer】二叉树的深度
题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。示例: 输入用例的二叉树如下:输入:{1,2,3,4,5,#,6,#,#,7}返回:4思路1: 本题是常见的二叉树算法题,第一种是借助队列这种数据结构,遍历每层节点后将层数加1function TreeDepth(pRoot){ // write code here if(!pRoot){ return 0;原创 2022-03-29 16:22:52 · 500 阅读 · 0 评论 -
【剑指offer】数字在升序数组中出现的次数
题目:给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数示例输入:[1,2,3,3,3,3,4,5],3返回值:4思路1: 这道题最简单的就是暴力穷举,遍历计数思路2: 由于是升序数组,因此可用二分查找找出k的上界和下界function GetNumberOfK(data, k){ // write code here var number = 0; if(data.length>0){ var fi原创 2022-03-29 15:29:38 · 841 阅读 · 0 评论 -
【剑指offer】04.二叉树的镜像
描述: 将给定的二叉树,将其变换为源二叉树的镜像示例1:输入:{8,6,10,5,7,9,11}复制返回值:{8,10,6,11,9,7,5}复制思路1: 这道题很容易想到用递归的思想将左右子树进行交换,这种思路的空间复杂度和时间复杂度都是O(n)代码如下function Mirror( pRoot ) { // write code here if(!pRoot){ return; } var left = pRoot.left;原创 2022-03-26 21:10:04 · 303 阅读 · 0 评论 -
【剑指offer】03.替换空格
描述请实现一个函数,将一个字符串s中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。题解思路1:我本来是想直接用s.replaceAll(’ ‘,’%20’),这个函数直接替换所有的空格,结果牛客上的node.js版本过低,一直提示没有replaceAll这个方法思路2:然后我就想着遍历一下字符串,遇到空格就替换,结果因为对字符串的特性还不是很熟悉,这么简单的思想竟然调试了好久function replaceSp原创 2022-03-10 17:42:12 · 592 阅读 · 0 评论 -
【剑指Offer】02.二维数组中的查找
描述在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]给定 target = 7,返回 true。给定 target = 3,返回 false。数据范围:矩阵的长宽满足 0≤n,m≤5000≤n,m≤500 , 矩阵中的值满足 0≤val ≤10901原创 2022-03-09 21:36:14 · 64 阅读 · 0 评论 -
【剑指Offer】01.数组中重复的数字
描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1数据范围:0≤n ≤10000进阶:时间复杂度O(n),空间复杂度O(n)题解这道题思路比较简单,我直接使用一个Set集合,然后遍历numbers数组并添加到Set集合中,用has方法判断如果在set中则直接返回,原创 2022-03-09 21:27:55 · 67 阅读 · 0 评论 -
2100适合打劫银行的日子
2100适合打劫银行的日子问题示例问题你和一群强盗准备打劫银行。给你一个下标从 0 开始的整数数组 security ,其中 security[i] 是第 i 天执勤警卫的数量。日子从 0 开始编号。同时给你一个整数 time 。如果第 i 天满足以下所有条件,我们称它为一个适合打劫银行的日子:第 i 天前和后都分别至少有 time 天。第 i 天前连续 time 天警卫数目都是非递增的。第 i 天后连续 time 天警卫数目都是非递减的。更正式的,第 i 天是一个合适打劫银行的日子当且仅当:原创 2022-03-07 09:08:35 · 109 阅读 · 0 评论