- 博客(41)
- 收藏
- 关注
原创 代码随想录二刷-队列及其应用题目(JS)【重要】
JS语言中没有堆这种数据结构,我们需要自己定义排序算法(大顶堆还是小顶堆)从队尾插入一个元素删除堆顶元素在本科时学了很多堆的理论,但之前用Java刷题时并没有涉及,现在给你一个实现那些理论的机会Java直接给你定义好了。
2023-04-17 15:05:08
473
1
原创 代码随想录二刷-栈及其相关题目(JS)
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。tokens[i] 是一个算符(“+”、“-”、“*” 或 “/”),或是在范围 [-200, 200] 内的一个整数。给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串,判断字符串是否有效。输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,“输入:tokens = [“4”,“13”,“5”,“/”,“+”]返回一个表示表达式值的整数。
2023-04-17 15:01:58
419
原创 代码随想录二刷-栈与队列基础(JS)
在pop()中首先我们确定this.stackOut中有无元素,有的话直接移除该元素,没有的话,将this.stackIn中的元素全部加入this.stackOut,然后this.stackOut.pop()pop():需要在末尾删除元素,而shift()只能在开头删除元素,所以需要定义一个函数把末尾元素前面的所有元素都重新push进数组,移除最开头的元素。你所使用的语言也许不支持队列。在JS语言中,没有栈这种数据结构,我们用数组来充当栈,数组的push(),pop()方法可以在数组尾部添加和删除元素。
2023-04-17 14:58:53
537
原创 代码随想录二刷-字符串-KMP算法及相关题目(JS)
如果len % (len - (next[len - 1] )) == 0 ,则说明数组的长度正好可以被 (数组长度-最长相等前后缀的长度) 整除 ,说明该字符串有重复的子字符串。如果 s[i] 与 s[j] 相同,那么就同时向后移动i 和j 说明找到了相同的前后缀,同时还要将j(前缀的长度)赋给next[i], 因为next[i]要记录相同前后缀的长度。那么 s[i] 与 s[j] 不相同,就要找 j前一个元素在next数组里的值(就是next[j-1])。解释: 可由子串 “abc” 重复四次构成。
2023-04-13 16:01:45
368
原创 代码随想录二刷-字符串-反转字符串及相关题目(JS)
【一定不要忘记重新设置字符串的大小,在JS语言中,要么改变strArr.length,要么返回一个截取后的字符串,对应代码方法一中的两种截取方法】没有无缘无故的错,只有你没有注意到的知识点,静下心来调试看哪部分出错,自己发现不了就去查,查不到就去问,不要内耗,内耗一点用都没有还会降低你的自信。给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
2023-04-13 16:01:02
603
原创 代码随想录二刷-哈希表-几数之和 (JS)
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]输入:nums = [1,0,-1,0,-2,2], target = 0。
2023-04-11 21:58:49
320
原创 代码随想录二刷-哈希表-两个数组的交集(JS)
先将nums1和nums2分别存入Map中,然后遍历nums1Map,如果nums1Map中的key在num2Map中存在,取两者的最小value,加入最小value次这个key。遍历nums1中的所有元素,把它存放到map中,其中key就是nums1中的元素,value就是这个元素在数组nums1中出现的次数。遍历nums2中的所有元素,查看map中是否包含nums2的元素,如果包含,就把当前值加入到数组中,然后对应的value要减1。先对两个数组进行排序,然后使用两个指针,分别指向两个数组开始的位置。
2023-04-11 21:53:59
381
原创 代码随想录二刷-哈希表-有效的字母异位词及其相关题目(JS)
因为字符串 pp 的异位词的长度一定与字符串 pp 的长度相同,所以我们可以在字符串 ss 中构造一个长度为与字符串 pp 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;由于互为字母异位词的两个字符串包含的字母相同,因此两个字符串中的相同字母出现的次数一定是相同的,故可以将每个字母出现的次数使用字符串表示,作为哈希表的键。由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。不考虑答案输出的顺序。
2023-04-11 21:51:57
439
原创 代码随想录二刷-链表-其他题目(JS)
可以设置多个变量:cur(两个交换节点前一个节点) firstNode,secondNode,temp(临时存放的两个节点后面的节点)给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。所以我们需要从末端将两个链表对齐,也就是说求出两个链表的差值,将设置指针指向长链表,移动该节点。然后开始同时移动长链表和短链表的指针,若这两个指针存在相等的情况,则返回当前指针指向的元素。本题的思路并不难,但容易绕晕。
2023-04-09 21:37:19
75
原创 代码随想录二刷-链表-双指针相关题目(JS)
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。给定一个链表的头节点 head ,返回链表开始入环的第一个节点。所以我们设置一个指针key1 从 相遇节点出发,一个指针key2从head出发,直到两者相遇。设定快慢两个指针,快指针每次移动两个节点,慢指针每次移动一个节点,终会相遇。,请你反转链表,并返回反转后的链表。给你一个链表,删除链表的倒数第。
2023-04-09 21:35:54
68
原创 代码随想录二刷-链表-链表基础(JS)
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。val 是当前节点的值,next 是指向下一个节点的指针/引用。所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。假设链表中的所有节点下标从 0 开始。输入:head = [1,2,6,3,4,5,6], val = 6。输入:head = [7,7,7,7], val = 7。
2023-04-09 21:30:13
74
原创 代码随想录-数组-螺旋矩阵及其相关题目(JS)
思路不难,主要是在大脑中模拟过程(大脑不行,在草稿纸上模拟)主要考察对于遍历过程的掌握,含糊过去就很容易出错。
2023-04-08 20:54:00
214
原创 代码随想录-数组-长度最小的子数组(滑动窗口)及相关题目(JS)
在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 r 指针,和一个用于「收缩」窗口的 l指针。需要注意的是,将fruits[left] 从哈希表中移除后,如果 fruits[left] 在哈希表中的出现次数减少为 0,需要将对应的键值对从哈希表中移除。我们可以使用滑动窗口解决本题,left 和 right 分别表示满足要求的窗口的左右边界,同时我们使用哈希表存储这个窗口内的数以及出现的次数。输入:target = 11, nums = [1,1,1,1,1,1,1,1]
2023-04-08 14:56:56
204
原创 代码随想录-数组-移除元素(双指针)及其相关题目(JS)
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。采用双指针,左右指针分别指向非递减数组两端,平方后比较大小,大的加入新数组(倒序加入),移动大的元素一端的指针,直到left >right。给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
2023-04-08 14:56:31
99
原创 代码随想录-贪心算法【2】(Java)
链接: 860.柠檬水找零本题思路非常简单主要是抓住问题的本质,没有抓住问题的本质,很容易被一些无关紧要的细节困住。认真审题,情况也不多,把各种情况列一下呗。自己的代码,if结构太多,冗长,容易出错官方代码在前面的判断中,只考虑有的情况,没有的情况正常操作;最后再判断按正常操作下的ten和five是否为负数,有负数说明我们在不符合条件的情况下操作了,所以报错。链接: 406.根据身高重建队列本题的思路很简单,主要是二维数组看起来会比较复杂但熟悉java语言的语法,本题会比较简单思路就是按身高从大到小排列
2023-04-01 20:53:58
106
原创 代码随想录-回溯算法-全排列问题
链接: 46.全排列树枝去重设置一个布尔类型的used数组来记录该元素是否使用过如果使用过,used[i] == true 我们就将该元素跳过全排列II链接: 47.全排列 II
2023-04-01 17:46:45
113
原创 代码随想录-二叉树【3】(Java)
链接: 236. 二叉树的最近公共祖先本题很自然想到自底向上查找,回溯思想,而后序遍历(左右中)是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑两种情况:1.p,q分属于左右子树2.p,q其中之一为公共祖先判断逻辑:如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。二叉搜索树的最近公共祖先链接: 235. 二叉搜索树的最近公共祖先与普通二叉树不同,二叉搜索树具有两个特征:1.二叉搜索树的左子树均小于根节点,
2023-03-31 22:32:46
59
原创 代码随想录-二叉树【2】(Java)
链接: 106.从中序与后序遍历序列构造二叉树具体思路见代码or思维导图自己刚开始写时,思路非常混乱,应该用文字理清思路,在代码中注释后,再一步步想办法如何用代码诠释这些文字后来各种小的报错root.left和root.right不需要再次定义!在TreeNode的定义中已经将它们的定义写好了。最大二叉树链接: 654.最大二叉树思路非常简单找到序列中的最大值,创建节点,然后再遍历最大值分隔出的左区间和右区间,用root.left和root.right进行接收注意:用数组构造二叉树的题目,每次分隔尽量
2023-03-31 22:14:48
61
原创 代码随想录-二叉树【1】(Java)
针对翻转二叉树,本笔记给出了一种递归,三种迭代(两种模拟深度优先遍历,一种层序遍历)的写法,都是之前我们讲过的写法,融汇贯通一下而已。
2023-03-31 21:12:42
63
原创 代码随想录-动态规划-回文子串相关问题(Java)
链接: 647. 回文子串重点区分回文子串与回文子序列的长度,子串说明这个子字符串必须是连续的而回文子序列不一定连续。本题因为回文子串是连续的字符串,不能用一般的动态规划方法做(maybe)1.dp数组含义表示下标i到下标j构成子串是回文串2.递推公式宏观把握:该回文串依赖是否为true细化,如果i 和 j 相同 或者相差一个元素,i + 1和j - 1这种形式正好错开,我们距离发现,当s.charAt(i) =s.charAt(j),即使不关注,依然是回文子串所以就可以分为三种(or前两种合并)情况。3.
2023-03-31 16:17:09
116
原创 代码随想录-动态规划-打家劫舍问题(Java)
链接: 198.打家劫舍自己的思路动态规划五部曲:1.dp[j] 是指偷到 第 j 号房屋时,能偷窃到的的最大金额2.不知道该怎么写(大胆写呗,别想那么多)官方讲解思路本题中,当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了;当前状态和前面状态会有一种依赖关系,那么这种依赖关系都是动态规划的递推公式1.dp[i]含义dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]2.dp[i] = dp[i - 2] + nums[i]3.dp数组如何初始化从递推公式dp[i] = max
2023-03-30 21:14:16
190
原创 代码随想录-动态规划-简单题目(Java)
如果某一问题有很多重叠子问题,使用动态规划是最有效的所以动态规划中每一个状态一定是由上一个状态推导出来的(这一点就区分于贪心),贪心没有状态推导,而是从局部直接选最优的以上,除不同路径两道题外,即使循环是双重循环,但dp数组也都是一位数组,j的循环是一种辅助。
2023-03-29 19:24:24
110
原创 代码随想录 - 二叉树的各种遍历方法(Java)
那么再看看中序遍历,中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中),这就造成了。分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,而广度优先遍历的实现一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树。我们以中序遍历为例,在。
2023-03-28 18:06:34
1253
原创 代码随想录-Day10、11、13栈与队列相关题目(Java)
这k个元素按照小顶堆弹出的顺序,在前面的应该是出现次数最少的,所以我们设置了一个新的数组,采用倒序接收优先级队列中的元素(这个元素是键值对,我们只用接收键值对里面的key即可)大体思路是,一边遍历哈希表,一边往优先级队列里面加,如果优先级队列大于我们所需的大小k,则新元素与优先级队列最开头即最小的元素进行比较,如果大于,则弹出开头最小的元素,将新元素加入优先级队列中。在单调队列里面比较大小,如果该新元素比单调队列里面的所有元素都大,则单调队列里面的元素都删除,加入新的元素。
2023-03-27 15:00:06
75
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人