![](https://img-blog.csdnimg.cn/20210619195004885.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode
刷题系列-LeetCode
卑微菜鸟一枚
已转行!
展开
-
二叉树的前序遍历
前序遍历前序遍历:根 --》左 --》 右一、递归var preorderTraversal = function(root) { const res = []; dfs(root); return res; function dfs(root) { if (root == null) return; res.push(root.val); dfs(root.left); dfs(root.right).原创 2021-07-10 14:26:29 · 102 阅读 · 0 评论 -
后序遍历二叉树(迭代 vs 递归)
二叉树的后序遍历后序遍历:左 - 右 - 根考过前序遍历原创 2021-07-10 14:25:42 · 126 阅读 · 0 评论 -
判断链表是否有环
判断链表是否有环无论利用哪种方法,特判还是需要的,没有节点,或者只有一个节点说明一定是没有环,方法一:利用数组判断类似哈希表,每次将头结点插入数组中,头结点指向下一个位置,判断在数组中是否存在当前节点,如果存在就说明存在环的。不存在就没有换。var hasCycle = function(head) { if (head == null || head.next == null) return false; const res = []; while (head) {原创 2021-07-09 19:34:55 · 85 阅读 · 0 评论 -
最大连续1的个数
最大连续1的个数转换成:找出一段最大区间,使得里面0的个数不超过k个。参考大佬的题解var longestOnes = function(nums, k) { let zeroCount = 0, left = 0, len = nums.length, res = 0; for (let right = 0; right < len; right ++) { if (nums[right] == 0) zeroCount ++; whi.原创 2021-07-09 09:00:46 · 82 阅读 · 0 评论 -
根据前序和中序构造整个二叉树
根据前序和中序构造整个二叉树前序遍历:根 左 右中序遍历:左 根 右先根据前序遍历,得到根节点3,然后看中序遍历,可以知道9是3的左孩子[15,20,7]是3的右孩子再去先序遍历的到9,再到中序遍历可知,9左右孩子都为空,再根据前序遍历得到根节点20,再根据中序遍历得到20的左子树是15, 右子树是17;总结: 先根据先序遍历得到根节点,在去中序遍历中根据根节点找到左右两个子树。重复上述步骤即可思想有了,代码实现起来还是……有点问题为了能够快速在中序遍历得到根原创 2021-07-05 14:01:21 · 364 阅读 · 0 评论 -
二叉树的中序遍历
二叉树的中序遍历递归中序遍历: 左 -》中 -》 右var inorderTraversal = function(root) { var res = []; dfs(root); return res; function dfs(root) { if (root == null) return; dfs(root.left); res.push(root.val); dfs(root.right);原创 2021-07-05 12:07:18 · 75 阅读 · 0 评论 -
0-n-1中缺失的数字
0-n-1中缺失的数字一共N个数范围在0 ~ n-1 之间; 但是数组的长度只是n - 1 所以有一个数缺失了,找出那个缺失的数字、有两个关键信息;数组是有序的,递增数字都是唯一的,就少一个数字二分需要先将特殊情况排除掉;数组为空前 n - 1个数都是正确的下标是[0, n - 2],缺少最后一个数var missingNumber = function(nums) { if (nums === null) return 0; let len = nums.len原创 2021-07-03 21:35:17 · 119 阅读 · 0 评论 -
二叉搜索树第k小元素
二叉搜索树第k小元素二叉搜索树的中序遍历是一个递增的序列(左根右)中序遍历完整二叉搜索树,每次将遍历到的节点存入数组中去,找到第k - 1个节点返回即可k是从下标1开始的,存到结果数组res中,但是下标是从0开始的.这个样例res = [1,2,3,4,5,6]时间复杂度O(n) n 表示有多少个节点中序遍历二叉搜索树k次,返回第K次结果;时间复杂度:O(k)var kthSmallest = function(root, k) { // 中序遍历 根左右 c原创 2021-07-01 20:28:37 · 78 阅读 · 0 评论 -
x的平方根
x的平方根求平方根不使用 Math.sqrt() 上代码:var mySqrt = function(x) { let l = 0, r = x; while (l < r) { let mid = l + r + 1 >> 1; if (mid <= Math.floor(x / mid)) l = mid; else r = mid - 1; } return r;};...原创 2021-06-30 15:14:32 · 93 阅读 · 0 评论 -
亲密字符串
给了很多的样例,总结一下如果两个字符串长度不一样,直接false; 样例5如果两个字符串一样,只要有一个字符是重复的就可以通过交换使得s == goal 这样就能够满足条件。样例2和3(*) 判断一个字符出现的次数。如果两个字符串不一样,记录不一样的下标,可以通过交换下标使得对应值相等这里对于步骤2做一些说明, 但是想通过哈希表来实现,但是技术太菜,没能实现,看了评论区,还有大佬就本题而言直接用一行代码搞定return s.length > new Set(s).sizefunc..原创 2021-06-29 22:01:45 · 136 阅读 · 0 评论 -
旋转字符串
旋转字符串将字符串a中的每一个字符添加到a的结尾,比较a和b是否相同var rotateString = function(s, goal) { if (s === "" && goal === "") return true; let len = s.length - 1; let i = 0; while (i < len) { s = s.slice(1) + s.slice(0,1); if (s ===原创 2021-06-29 18:30:05 · 57 阅读 · 0 评论 -
验证回文字符串
验证回文字符串||最多删除一个,表示要是字符串本身也是回文字符串的话也是可以的,字符串中只包含小写字母,就不用转换或者剔除不满足条件的,直接判断即可判断回文字符串的话,用两个指针从两头枚举,如果遇到的字符不相等就判断从[i + 1, j] 干掉s[i] 或者 干掉s[j] 判断[i, j - 1]之间是不是回文字符串。function check(s, l, r) { while (l < r) { if (s[l] == s[r]) {原创 2021-06-29 17:57:07 · 102 阅读 · 0 评论 -
Lc5-最长回文字串
Lc5-最长回文子串js 求数组求字符串的长度都是length方法js 字符串截取,var longestPalindrome = function(s) { let res = ''; for (let i = 0; i < s.length; i ++) { let l = i - 1, r = i + 1; sub(l, r); l = i, r = i + 1; sub(l, r); fu原创 2021-06-29 14:22:42 · 112 阅读 · 0 评论 -
二叉树的最大深度
考过二叉树的最大深度二叉树的最大深度 = 等于左右二叉树最大深度 + 1,然后递归处理左右子树即可var maxDepth = function(root) { if (root == null) return 0; return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;};n叉数的最大深度var maxDepth = function(root) { if (root == null) r.原创 2021-06-29 13:32:02 · 146 阅读 · 0 评论 -
和为s的两个数字 - 双指针
题目:和为s的两个数字有序第一上来,想到的是二分,但是没有实现,看了题解 双指针,很好理解重要的是数组有序设置两个指针分别指向数组的开头i和结尾j,如果当前两个指针指向的值比目标值大nums[i] + nums[j] > target ,又因为数组是递增的,所以为了更接近目标值只能够将i ++ 这样才能够更接近目标值。否则j --var twoSum = function(nums, target) { let i = 0, j = nums.length - 1; le原创 2021-06-29 13:02:21 · 50 阅读 · 0 评论 -
经典的二分查找
二分查找模板题,一些边界条件特别多的适合模板题,30s秒了var search = function(nums, target) { let l = 0, r = nums.length; while (l < r) { let mid = l + r >> 1; if (nums[mid] >= target) r = mid; else l = mid + 1; } if (nums[l] !=原创 2021-06-29 12:18:49 · 50 阅读 · 0 评论 -
逆序对的数量
逆序对的数量模板题,在归并排序的基础上暴力做法会超时,function merge_sort(a, l, r) { if (l >= r) return 0; let mid = l + r >> 1; let res = merge_sort(a, l, mid) + merge_sort(a, mid + 1, r); let tem = [], i = l, j = mid + 1; while (i <= mid &&a原创 2021-06-28 09:46:29 · 42 阅读 · 0 评论 -
Lc169多数元素
题目:多数元素思路:人多就是硬,把所有的数分为两个部分,多数元素为一个部分,其他元素为一个部分,两者相互抵消,最后剩下的数一定是步骤:r表示目标元素, c表示目标元素的个数遍历数组的时候,维护r和 c如果当前元素不等于目标元素nums[i] != r, 个数c --当c的个数为0的时候,将r换成nums[i] ,如果当期元素等目标值,个数c++代码实现var majorityElement = function(nums) { let r = nums[0], c = 1;原创 2021-06-27 10:50:36 · 64 阅读 · 0 评论 -
Lc92 翻转链表
Lc92 翻转链表var reverseBetween = function(head, m, n) { // 可能翻转头结点 头结点会变 创建虚拟头结点 dummy 从虚拟头结点条m - 1 // 1、将m到n之间的链表翻转 就是怎么找到m的前一个节点 循环m - 1次 let dummy = new ListNode(-1); dummy.next = head; let a = dummy; for (let i = 0; i < m原创 2021-06-26 21:39:00 · 51 阅读 · 1 评论 -
Lc206翻转链表
Lc206翻转链表迭代版本;var reverseList = function(head) { if (head == null) return null; let a = head, b = a.next; while (b) { let c = b.next; b.next = a; a = b; b = c; } head.next = null; return a;};递归原创 2021-06-25 23:22:27 · 82 阅读 · 0 评论 -
Lc1047删除字符串中所有重复项
删除字符串中所有重复项利用栈来存储,遍历字符和当前栈顶元素进行比较,如果栈不为空stack != null,并且等于遍历到的当前元素 == 栈顶元素value = stack[stack.length - 1],就把栈顶元素弹出stack.pop()否则压入栈中stack.push(value)var removeDuplicates = function(s) { let stack = []; for (value of s) { if (stack !=原创 2021-06-24 15:27:51 · 47 阅读 · 0 评论 -
Lc24两两交换链表
两两交换链表p指针指向交换两个节点的前一个节点步骤如图,但是代码2.3需要交换位置。var swapPairs = function(head) { let dummy = new ListNode(-1); dummy.next = head; for (let p = dummy; p.next && p.next.next;) { let a = p.next, b = a.next; p.next = b;原创 2021-06-24 14:29:55 · 66 阅读 · 0 评论 -
Lc1013将数组分成相等的三个部分
Lc1013将数组分成相等的三个部分第一想法就是看看数组所有和是不是能够被3整除,但是i + j < j这个条件没有用上所以感觉不对,但还是提交了,因为想不出出来其他的例子,让编译器给个提示,然后就有这个了[0,2,1,-6,6,7,9,-1,2,0,1] 总和sum = 21 但是前面一段找不到和为7的一个子段。var canThreePartsEqualSum = function(arr) { let sum = 0; for (let i = 0, len = arr.le原创 2021-06-24 10:49:31 · 65 阅读 · 0 评论 -
Lc151翻转字符串里的单词
翻转字符串里的单词差一点就做出来,一开始用空格拆分单词,但是这个样例the sky is blue 没有通过,单词之间有多个空格的情况,然后看了评论区……学了一个正则表达式/\s+/这是正则表达式。\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。+匹配前面的子表达式一次或多次。split( )分割字符串函数;var reverseWords = function(s) { let res = s.trim().split(/\s+/).reve原创 2021-06-24 09:24:03 · 52 阅读 · 0 评论 -
二叉搜索树的最近公共祖先
二叉搜索树的最近公共祖先二叉搜索树所有右子树的节点都比左子树节点大,仔细观察给的二查搜索树是不是满足这个条件,按照前序遍历能够组成一个有序的序列分情况讨论:1. 两个节点不在同一侧,一个在左子树,一个在右子树,最近公共祖先就是根节点。2. 两个节点都在左子树上面,只用递归左子树就好3. 两个节点都在右子树上面,只有递归处理右子树if (p.val <= root.val && q.val > root.val)return root;var lowestC原创 2021-06-23 21:10:29 · 144 阅读 · 0 评论 -
Lc866回文素数
Lc866回文素数样例1:input: 6output: 7样例2:input: 8output: 11样例3:input: 13output: 101一个偶数位的回文数一定是 11 的倍数 这个性质不知道一般做不出来;知道这个就能够将所有位数为偶数的数字判断出来。处理奇数位,只处理一半,可以将时间复杂度从o(n)变成O(sqrt(n)),将123变化后结果应该是12321 传入的是一个数字,转为字符串a。本来我想直接a.reverse()一下,但是报了a原创 2021-06-23 20:30:51 · 185 阅读 · 0 评论 -
Lc123验证是不是回文序列
Lc123验证是不是回文序列提取里面所有的字符串,统一转换成小写/大写利用两个指针从两头依次判断这是我 自己没看题解做出来的,var isPalindrome = function(s) { let tem = ''; for (let i = 0; i < s.length; i ++) { if (s[i] >= 'a' && s[i] <= 'z' || s[i] >= '0' && s[i] <原创 2021-06-23 18:51:33 · 231 阅读 · 0 评论 -
Lc19删除链表的倒数第N个节点
Lc19删除链表的倒数第N个节点处理好一下几个问题就能够做出来:注意有可能删除头结点,凡是头结点会变化的,习惯建一个虚拟头结点,让这个虚拟头结点指向链表的头结点。如果不用虚拟头节点,需要特判一下删除头结点的情况即len == n在链表中删除一个结点应该怎么做?知道链表长度len,知道要删除的第n个结点,如何得到要删除的结点,即循环多少次能够使指针指向要删除的这个结点在上面的6个结点 ,删除倒数第3个结点,需要遍历要删除结点的前一个结点到len - n - 1var removeNthF原创 2021-06-23 13:21:56 · 107 阅读 · 0 评论 -
Lc101对称二叉树
Lc101对称二叉树是对称二叉树的充分必要条件有两个根节点相同第一个左子树 == 第二个右子树; 第一个右子树 == 第二个左子树步骤如下 :首先判断根节点,如果根节点为空,说明就是一颗空的树,对称的二叉树左右两个树的根节点,对称(左边左子树==右边右子树 && 左边右子树 == 右边左子树)遍历左右两个子树function dfs(L, R) { if (L == null && R == null) return true; // 左右两个原创 2021-06-22 18:09:55 · 95 阅读 · 0 评论 -
LC62不同路径
$ \frac{\left ( n + m - 2 \right )!}{\left ( n - 1 \right )!\left ( m - 1 \right )!} $原创 2021-06-21 20:20:29 · 141 阅读 · 1 评论 -
Lc695-岛屿的最大面积
Lc695-岛屿的最大面积好吧 我承认一开始 输入输出我就么看懂,6是怎么来的,11又是什么?蓝色部分是答案6,它与红色部分是斜着连在一起的,所以不算答案的一部分,只能是水平或垂直的方向深度遍历每遍历一个点,就向四周扩散,然后对四周的每个点再遍历,遍历的时候标记一下四个方向遍历的坐标对应的变化function dfs(x, y, grid) { if (x < 0 || y < 0 || x >= grid.length || y >= grid[0].原创 2021-06-20 11:23:26 · 95 阅读 · 0 评论 -
顺时针90°旋转矩阵
旋转图像步骤:沿着主对角线翻转q[i][j] <==> q[j][i]沿着中轴翻转 –var rotate = function(matrix) { let n = matrix.length; for (let i = 0; i < n; i ++) { for (let j = 0; j < i; j ++) { let t = matrix[i][j]; matrix[i][j]原创 2021-06-19 13:08:19 · 242 阅读 · 0 评论 -
数组中的第K个最大元素
数组中的第K个最大元素将数组排序之后,输出第k个最大的元素快速选择算法快速选择算法基于快速排序算法,所以我们下来学习一下快速排序确定分界点x x 可以是q[l] q[r] q[l + r >> 1]任意一个都是可以的 lr是区间的左右边界调整区间,左边所有的数都 <= x , 右边所有的数都 >= x x不一定是在中间利用两个指针i j,指针i 指向左侧,如果i指向的数值 <x 那么就一直移动,直到i指向的数 >x就暂时停止;指针j指向右侧,原创 2021-06-19 12:35:18 · 115 阅读 · 0 评论 -
LC112路径总和
Lc112路径总和题目描述给定一棵二叉树和一个 sum,判断是否存在一条从根节点到叶节点的路径,路径上所有数的和等于 sum。注意:叶节点指不包含儿子的节点。样例返回 true,相应的路径是 5->4->11->2。递归: 从根节点往叶子节点走,每走过一个节点,让sum 减去经过节点的值,如果走到某个叶子节点时,sum = 0 就说明从根节点到这个叶子节点的路径上的和等于sum时间复杂度分析: 每个节点仅被遍历一次,递归过程中维护sum原创 2021-06-19 11:11:05 · 108 阅读 · 0 评论 -
LC70爬楼梯
爬楼梯本质就是斐波那契,变化的只是初始值,有递归版本和迭代版本,两种版本都要熟练掌握方法一: 递推开一个大数组,记录每个数的值。用循环递推计算。总共计算 n 个状态,所以时间复杂度和空间复杂度都是 O(n)。var climbStairs = function(n) { // 1 2 3 5 // 1 2 3 4 if (n <= 2) return n; let f = [0,1,2]; for (let i = 3; i <= 45; i原创 2021-06-18 13:56:54 · 58 阅读 · 0 评论 -
LC1两数之和
LC1两数之和方法一、暴力做法 O(n^2)var twoSum = function(nums, target) { let res = []; for (let i = 0; i < nums.length; i ++) { for (let j = i + 1; j < nums.length; j ++) { if (nums[i] + nums[j] == target) { res.push原创 2021-06-18 13:29:36 · 72 阅读 · 0 评论 -
LeetCode刷题目录
每天花一点时间刷算法题,自6.17开始刷LeetCode提上征程,争取每天做一道题……实话说我也知道到能不能够坚持下来,合并两个有序数组字符串相加无重复最长字串比较版本号下一篇 两数之和...原创 2021-06-18 10:33:16 · 99 阅读 · 0 评论 -
Lc165-版本号比较
Lc165 版本号比较样例:版本号有这样几个特性:通过小数点分割 – splice(‘.’) 分割后以字符串的形式保存在数组中 举个例子 let version = '123.456.789.000'; version.split('.'); // ["123", "456", "789", "000"]可能包含前导零 – parsenInt("00123") = 123 将字符串去除前导零位数不齐用0来代替步骤:以小数点分割字符串取两个数组中长度较长的那个用来遍历数原创 2021-06-18 10:02:31 · 85 阅读 · 0 评论 -
LC3无重复最长字串
链接:无重复最长字串步骤:定义两个指针i,j 表示当前扫描到的字串是[i,j] (闭区间)扫描过程中维护一个哈希表unordered_map<char,int> hash 表示[i, j] 中每个字符出现的次数、指针j 向后移动一位,同时将哈希表中s[j] 的次数 +1 hash[s[j]] ++假设j移动的当前区间[i, j] 中没有重复字串, 一旦j 移动后那么只有s[j] 出现了2次,不断移动i直到区间中s[j]的个数等于1为止。时间复杂度:O(n)int lengthO.原创 2021-06-17 21:50:40 · 137 阅读 · 0 评论 -
LC415字符串相加
LC415字符串相加这题的本质是大整数相加,思想很简单,但是就是看怎么巧妙的将代码实现步骤:i 和 j 分别指向num1 和 num2 的最后一位,t表示进位,每次计算他们两个的结果和t += num1[i] + num2[j] 每次运算后i 和j都要后移一位 这句话非常巧妙 让进位t担任两个角色将t的余数压入结果数组中去res.push(t % 10) 这里的t是进位t和num1[i] num2[j]三个数的和将t转换为上一次的进位 t = t % 10 原理上是这样但是存在精度问题所以t .原创 2021-06-17 21:02:57 · 104 阅读 · 0 评论