
LeetCode
赵自煜
只要爷不死,爷就能东山再起!
展开
-
无序数组中找中位数
先快排(分治)function quickSort(arr) { if (arr.length <= 1) return arr; let mid = arr[0], left = [], right = []; for (let i = 1; i < arr.length; i++) { if (arr[i] < mid) { left.push(arr[i]); } else {原创 2021-03-22 15:15:34 · 566 阅读 · 0 评论 -
力扣之257. 二叉树的所有路径
给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val;原创 2020-09-04 14:41:39 · 140 阅读 · 0 评论 -
力扣之486. 预测赢家
给定一个表示分数的非负整数数组。 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数组任意一端拿取分数,然后玩家 1 拿,…… 。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。示例 1:输入:[1, 5, 2]输出:False解释:一开始,玩家1可以从1和2中进行选择。 如果他选择 2(或者 1 ),那么玩家 2 可原创 2020-09-01 20:05:48 · 235 阅读 · 0 评论 -
力扣之841. 钥匙和房间
有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,…,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,…,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。最初,除 0 号房间外的其余所有房间都被锁住。你可以自由地在房间之间来回走动。如果能进入每个房间返回 true,否则返原创 2020-08-31 14:03:48 · 143 阅读 · 0 评论 -
力扣之214. 最短回文串(KMP算法)
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。示例 1:输入: “aacecaaa”输出: “aaacecaaa”示例 2:输入: “abcd”输出: “dcbabcd”/** * @param {string} s * @return {string} */var shortestPalindrome = function (s) { const reverse = s.split('').reverse原创 2020-08-29 16:45:31 · 344 阅读 · 0 评论 -
力扣之17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]/** * @param {string} digits * @return {string[]} */var letterCombinations = function (digits) { const map原创 2020-08-26 11:28:08 · 183 阅读 · 0 评论 -
力扣之491. 递增子序列
给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示例:输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7],[6, 7, 7], [7,7], [4,7,7]]说明: 给定数组的长度不会超过15。 数组中的整数范围是 [-100,100]。 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。/** * @param {number[]} nums原创 2020-08-25 16:04:56 · 281 阅读 · 0 评论 -
力扣之459. 重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例 1:输入: “abab”输出: True解释: 可由子字符串 “ab” 重复两次构成。示例 2:输入: “aba”输出: False示例 3:输入: “abcabcabcabc”输出: True解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。)/** * @param {string} s *原创 2020-08-24 13:33:54 · 284 阅读 · 0 评论 -
力扣之111. 二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2./** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; *原创 2020-08-21 14:07:15 · 175 阅读 · 0 评论 -
力扣之109. 有序链表转换二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树 0 / \ -3 9 / / -10 5/** * Definition for singly-linked li原创 2020-08-18 16:29:30 · 179 阅读 · 0 评论 -
力扣之100. 相同的树
给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3]输出: true示例 2:输入: 1 1 / \ 2 2原创 2020-08-07 10:46:13 · 127 阅读 · 0 评论 -
力扣之336. 回文对(又栽倒在Map手里了)
给定一组唯一的单词, 找出所有不同 的索引对(i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。示例 1:输入: [“abcd”,“dcba”,“lls”,“s”,“sssll”]输出: [[0,1],[1,0],[3,2],[2,4]]解释: 可拼接成的回文串为 [“dcbaabcd”,“abcddcba”,“slls”,“llssssll”]示例 2:输入: [“bat”,“tab”,“cat”]输出: [[0,1],[1,0]]解释:原创 2020-08-06 17:16:35 · 116 阅读 · 0 评论 -
力扣之9. 回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。var isPalindrome = function (x) { if (x < 0) return原创 2020-08-06 10:35:28 · 166 阅读 · 0 评论 -
力扣之337. 打家劫舍 III
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3 / \ 2 3 \ \原创 2020-08-05 15:38:02 · 172 阅读 · 0 评论 -
力扣之207. 课程表
你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]]输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。示例 2:输入: 2, [[1,0],[0,1]]输出: false原创 2020-08-04 15:13:16 · 408 阅读 · 0 评论 -
力扣之343. 整数拆分
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。说明: 你可以假设 n 不小于 2 且不大于 58。var integerBreak = function (n) { const arr = new Array(n + 1);原创 2020-07-30 13:48:49 · 174 阅读 · 0 评论 -
力扣之108.将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5/** * Definition for a binary tree node. * function原创 2020-07-03 11:38:23 · 165 阅读 · 0 评论 -
力扣之5. 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”/** * @param {string} s * @return {string} */var longestPalindrome = function (s) { let string = new String(); let left =原创 2020-05-21 13:08:54 · 139 阅读 · 0 评论 -
力扣之1371. 每个元音包含偶数次的最长子字符串
给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,‘e’,‘i’,‘o’,‘u’ ,在子字符串中都恰好出现了偶数次。示例 1:输入:s = “eleetminicoworoep”输出:13解释:最长子字符串是 “leetminicowor” ,它包含 e,i,o 各 2 个,以及 0 个 a,u 。示例 2:输入:s = “leetcodeisgreat”输出:5解释:最长子字符串是 “leetc” ,其中包含 2 个 e 。示例 3:输原创 2020-05-20 16:35:10 · 262 阅读 · 0 评论 -
力扣之680. 验证回文字符串 Ⅱ
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: “aba”输出: True示例 2:输入: “abca”输出: True解释: 你可以删除c字符。注意:字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。我的(有错误,两个if同时触发了)aguokepatgbnvfqmgml cu puufxoohdfpgjdmysgvhmvffcnqxjaguokepatgbnvfqmgml ucu puufxoohdfpgjdmysgvh原创 2020-05-19 15:19:02 · 259 阅读 · 0 评论 -
力扣之152. 乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。/** * @param {number[]} nums * @return {number} */var maxProduct = function (n原创 2020-05-18 10:58:54 · 176 阅读 · 0 评论 -
力扣之560. 和为K的子数组
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。我的方法:找出所有连续的子数组,然后计算每个子数组的和,再计数。当然是超时了O(n3)/** * @param {number[]} nums原创 2020-05-15 11:13:20 · 309 阅读 · 0 评论 -
力扣之136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4我的方式/** * @param {number[]} nums * @return {number} */var singleNumber = function (nums) { let sortedN原创 2020-05-14 11:26:18 · 149 阅读 · 0 评论 -
力扣之102. 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]因为queue.length在循环中受到影响,故不能作为条件使用/** * Definition for a binary tree node. * function TreeNo原创 2020-05-13 11:22:26 · 338 阅读 · 0 评论 -
力扣之155. 最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null,原创 2020-05-12 15:57:48 · 202 阅读 · 0 评论 -
力扣之50. Pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25说明:-100.0 < x < 100.0n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。...原创 2020-05-11 10:16:52 · 258 阅读 · 0 评论 -
力扣之7. 整数反转
示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21/** * @param {number} x * @return {number} */var reverse = function (x) { if (x == 0) { return 0; } else { let y = new Array(); y = String(x).split原创 2020-05-09 16:05:19 · 99 阅读 · 0 评论 -
力扣之69. x 的平方根
示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。/** * @param {number} x * @return {number} */var mySqrt = function(x) { return Math.floor(Math.sqrt(x))};为啥这题这么简单?...原创 2020-05-09 11:17:21 · 272 阅读 · 0 评论 -
力扣之1346. 检查整数及其两倍数是否存在
示例 1:输入:arr = [10,2,5,3]输出:true解释:N = 10 是 M = 5 的两倍,即 10 = 2 * 5 。示例 2:输入:arr = [7,1,14,11]输出:true解释:N = 14 是 M = 7 的两倍,即 14 = 2 * 7 。示例 3:输入:arr = [3,1,7,11]输出:false解释:在该情况下不存在 N 和 M 满足 N = 2 * M 。/** * @param {number[]} arr * @return原创 2020-05-09 10:42:54 · 223 阅读 · 0 评论 -
力扣之66. 加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例 2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321。// ...原创 2020-03-30 11:06:19 · 134 阅读 · 0 评论 -
力扣之455. 分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。注意:你可以假设胃口值为正。一个小...原创 2020-03-09 17:05:04 · 259 阅读 · 0 评论 -
力扣之面试题 01.04. 回文排列
给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。示例1:输入:“tactcoa”输出:true(排列有"tacocat"、“atcocta”,等等)网上大佬的代码var canPermutePalindrome = function (s) { let mySet...原创 2020-02-28 15:48:38 · 493 阅读 · 0 评论 -
力扣之高度检查器#1051
学校在拍年度纪念照时,一般要求学生按照 非递减 的高度顺序排列。请你返回能让所有学生以 非递减 高度排列的最小必要移动人数。示例:输入:heights = [1,1,4,2,1,3]输出:3提示:1 <= heights.length <= 1001 <= heights[i] <= 100var heightChecker = function (...原创 2020-02-27 17:00:46 · 159 阅读 · 0 评论 -
力扣之面试题 17.16. 按摩师
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。注意:本题相对原题稍作改动示例 1:输入: [1,2,3,1]输出: 4解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。示例 2:输入: [2,...原创 2020-02-27 13:36:12 · 318 阅读 · 0 评论 -
力扣之二进制表示中质数个计算置位#762
给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数。(注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。)示例 1:输入: L = 6, R = 10输出: 4解释:6 -> 110 (2 个计算置位,2 是质数)7 -> 111 (3 个计算置位,3 是质数)...原创 2020-02-26 14:36:44 · 227 阅读 · 0 评论 -
力扣之最小路径和#64
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。var minPathSum = function (grid) { let rowLength = g...原创 2020-02-25 15:58:42 · 124 阅读 · 0 评论 -
力扣之1. 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]var twoSum ...原创 2020-02-25 10:56:44 · 124 阅读 · 0 评论