leetcode
leetcode
沿着路走到底
涉及前端,后端,数据库
展开
-
动态规划 -- 746. 使用最小花费爬楼梯
力扣给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例 1:输入:cost = [10,15,20]输出:15解释:你将从下标为 1 的台阶开始。- 支付 15 ,向上爬两个台阶,到达楼梯顶部。总花费为 15 。示例 2:输入:cost = [1,100,1,1,1,原创 2022-03-11 10:39:24 · 75 阅读 · 0 评论 -
动态规划 -- 509. 斐波那契数
力扣斐波那契数(通常用F(n) 表示)形成的序列称为 斐波那契数列 。该数列由0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1)= 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给定n ,请计算 F(n) 。示例 1:输入:n = 2输出:1解释:F(2) = F(1) + F(0) = 1 + 0 = 1示例 2:输入:n = 3输出:2解释:F(3) = F(2) + F(1) =...原创 2022-03-11 09:49:39 · 101 阅读 · 0 评论 -
动态规划 -- 1137. 第 N 个泰波那契数
1/** * @param {number} n * @return {number} */var tribonacci = function(n) { const res = [0, 1, 1] if (n < 3) return res[n] for(let i = 3; i <= n; i++) { res[i] = res[i-1] + res[i-2] + res[i-3] } return res[res.length-1]};原创 2022-03-11 09:42:52 · 89 阅读 · 0 评论 -
回溯算法 -- 78. 子集
力扣给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]回溯算法解题思路要求:1、所有子集;2、没有重复元素。有出路、有死路。解题步骤用递归模拟出所有情况原创 2022-05-20 12:08:44 · 126 阅读 · 0 评论 -
回溯算法 -- 46. 全排列
力扣给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2:输入:nums = [0,1]输出:[[0,1],[1,0]]示例 3:输入:nums = [1]输出:[[1]]回溯算法解题思路要求:1、所有排列情况;2、没有重复元素。有出路、有原创 2022-03-10 11:15:00 · 69 阅读 · 0 评论 -
回溯算法的概念
回溯算法是算法设计中的一种方法。回溯算法是一种渐进式寻找并构建问题解决方式的策略。回溯算法会先从一个可能的动作开始解决问题,如果不行,就回溯并选择另一个动作,直到将问题解决。什么问题适合用回溯算法解决?有很多路。这些路里,有死路,也有出路。通常需要递归来模拟所有的路。使用场景全排列用递归模拟出所有情况。遇到包含重复元素的情况,就要回溯。收集所有到达递归终点的情况,并返回。1.原创 2022-03-10 10:59:49 · 311 阅读 · 0 评论 -
贪心算法 -- 121. 买卖股票的最佳时机
力扣给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 .原创 2022-03-10 10:05:43 · 157 阅读 · 0 评论 -
贪心算法 -- 122. 买卖股票的最佳时机 II
力扣给定一个数组 prices ,其中prices[i] 表示股票第 i 天的价格。在每一天,你可能会决定购买和/或出售股票。你在任何时候最多只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。返回 你能获得的 最大 利润。示例 1:输入: prices = [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(...原创 2022-03-09 17:43:19 · 10196 阅读 · 0 评论 -
贪心算法 -- 455. 分发饼干
力扣假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。示例1:输入: g = [1,2,3], s = [1,1]输出: 1解释:你有三个孩子和两块小饼干,3个孩子...原创 2022-03-09 16:52:02 · 402 阅读 · 0 评论 -
贪心算法的概念
贪心算法是算法设计中的一种方法。期盼通过每个阶段的局部最优选择,从而达到全局的最优。结果并不一定是最优。场景一:零钱兑换最优解:非最优解:1...原创 2022-03-09 15:23:31 · 97 阅读 · 0 评论 -
动态规划 -- 118. 杨辉三角
力扣给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。示例 1:输入: numRows = 5输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例2:输入: numRows = 1输出: [[1]]/** * @param {number} numRows * @return {number[][]} * 解题思路: 杨辉三角是.原创 2022-03-09 15:01:48 · 639 阅读 · 0 评论 -
动态规划 -- 213. 打家劫舍 II
力扣你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2)原创 2022-03-09 13:50:18 · 61 阅读 · 0 评论 -
动态规划 -- 198. 打家劫舍
力扣你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。...原创 2022-03-09 10:40:38 · 68 阅读 · 0 评论 -
动态规划 -- 70. 爬楼梯
力扣假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 1:输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入:n = 3输出:3解释:有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶动态规划解题思路爬到第 n 阶 可以在第 n-1 阶爬 1 个台阶,或者在原创 2022-03-08 16:50:19 · 497 阅读 · 0 评论 -
动态规划的概念
动态规划是算法设计中的一种方法。它将一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原来的问题。斐波那契数列定义子问题:F(n) = F(n-1) + F(n-2)。反复执行:从 2 循环 到 n ,执行上述公式。1...原创 2022-03-08 16:29:53 · 343 阅读 · 0 评论 -
101. 对称二叉树
力扣给你一个二叉树的根节点 root , 检查它是否轴对称。示例 1:输入:root = [1,2,2,3,4,4,3]输出:true示例 2:输入:root = [1,2,2,null,3,null,3]输出:false分而治之解题思路转化为:左右子树是否镜像。分解为:树1的左子树和树2的右子树是否镜像,树1的右子树和树2的左子树是否镜像。符合 分、解、合 特性,考虑选择分而治之。解题步骤分:获取两个树的左子树和右子树。解:递归原创 2022-03-08 16:17:53 · 49 阅读 · 0 评论 -
100. 相同的树
力扣给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入:p = [1,2,3], q = [1,2,3]输出:true示例 2:输入:p = [1,2], q = [1,null,2]输出:false示例 3:输入:p = [1,2,1], q = [1,1,2]输出:false1...原创 2022-03-08 15:06:31 · 110 阅读 · 0 评论 -
226. 翻转二叉树
力扣给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例 2:输入:root = [2,1,3]输出:[2,3,1]示例 3:输入:root = []输出:[]分而治之解题思路先反转左右子树,再将子树换个位置。符合 分、解、合 特性。考虑选择分而治之。解题步骤分:获取左右子树。解:递归地反转左右子树。合:原创 2022-03-08 15:02:46 · 137 阅读 · 0 评论 -
分而治之的概念
分而治之是算法设计中的一种方法。它将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将结果合并以解决原来的问题。场景一:归并排序分:把数组从中间一分为二。解:递归地对两个子数组进行归并排序。合:合并有序子数组。场景二:快速排序分:选基准,按基准把数组分成二个子数组。解:递归地对两个子数组进行快速排序。合:对两个子数组进行合并。1...原创 2022-03-08 13:54:26 · 51 阅读 · 0 评论 -
374. 猜数字大小
力扣猜数字游戏的规则如下:每轮游戏,我都会从1到n 随机选择一个数字。 请你猜选出的是哪个数字。如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1或 0):-1:我选出的数字比你猜的数字小 pick < num1:我选出的数字比你猜的数字大 pick > num0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick =...原创 2022-03-08 10:27:57 · 57 阅读 · 0 评论 -
21. 合并两个有序链表
力扣将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]解题思路与归并排序中的合并两个有序数组很相似。将数组替换成链表就能解此题。解题步骤新建一个新链表,作为返回结果。原创 2022-03-08 10:00:58 · 90 阅读 · 0 评论 -
二分 搜索
二分搜索的思路从数组的中间元素开始,如果中间元素正好是目标值,则搜索结束。如果目标值大于或小于目标元素,则在大于或小于中间元素的那一半数组中搜索。二分搜索的前提是数组是有序的,如果数组是乱序的,则首先要先对数组进行排序。时间复杂度每一次比较都使搜索范围缩小一半。O(LogN)const arr = [1, 2, 3, 4, 5]function binarySearch(item) { let low = 0; let high = arr.length -原创 2022-03-07 17:13:54 · 62 阅读 · 0 评论 -
顺序 搜索
顺序搜索的思路遍历数组。找到和目标值相等的元素,就返回它的下标。遍历结束后,如果没有搜索到目标值,就返回 -1 。时间复杂度遍历数组是一个循环操作。O(n)const arr = [1, 2, 3, 4, 5]function sequentialSearch(item) { for(let i = 0; i < arr.length; i++) { if(arr[i] === item) { return i } }原创 2022-03-07 16:48:57 · 52 阅读 · 0 评论 -
快速 排序
快速排序的思路时间复杂度O(n * LogN)1原创 2022-03-07 15:26:51 · 44 阅读 · 0 评论 -
归并 排序
归并排序的思路从第二个数开始往前比。比它大就往后排。以此类推进行到最后一个数。时间复杂度两个嵌套循环。O(n^2)1原创 2022-03-07 14:38:02 · 62 阅读 · 0 评论 -
插入 排序
插入排序的思路时间复杂度1原创 2022-03-07 13:42:00 · 54 阅读 · 0 评论 -
选择 排序
11原创 2022-03-07 11:35:06 · 42 阅读 · 0 评论 -
冒泡 排序
11原创 2022-03-07 09:50:58 · 45 阅读 · 0 评论 -
23. 合并K个升序链表
力扣给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6示例 2:输入:...原创 2022-03-04 16:03:50 · 67 阅读 · 0 评论 -
347. 前 K 个高频元素
力扣给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]class MinHeap { constructor() { this.heap = [] } swap(parentIndex, childIndex) { c原创 2022-03-04 14:29:32 · 37 阅读 · 0 评论 -
215. 数组中的第K个最大元素
力扣给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 41...原创 2022-03-04 11:54:38 · 38 阅读 · 0 评论 -
实现最小堆类
在类里,声明一个数组,用来装元素。主要方法:插入、删除堆项、获取堆项、获取堆大小。插入将值插入堆的底部,即数组的尾部。然后上移:将这个值和它的父节点进行交换,直到父节点小于等于这个插入的值。大小为 K 的堆中插入元素的时间复杂度为 O(logK)。删除堆顶用数组尾部元素替换堆顶(直接删除堆顶会破坏堆结构)。然后下移:将新堆顶和它的子节点进行交换,直到子节点大于等于这个新堆项。大小为 K 的 堆中删除堆顶的时间复杂度为 O(logK)。获取堆顶和堆的大小原创 2022-03-04 11:49:33 · 168 阅读 · 0 评论 -
堆的 概念
堆是一种特殊的完全二叉树。所有的节点都大于等于(最大堆)或小于等于(最小堆)它的子节点。最大堆最小堆JS中的堆JS中通常用数组表示堆。按广度优先左侧子节点的位置是 2 * index + 1右侧子节点的位置是 2 * index + 2父节点的位置是 (index - 1) / 2堆的应用堆能高效、快速地找出最大值和最小值时间复杂度:O(1)找出第 K 个最大(小)元素第 K 个最大元素构建一个最小堆,并将元素依次...原创 2022-03-04 10:45:58 · 184 阅读 · 0 评论 -
133. 克隆图
力扣给你无向连通图中一个节点的引用,请你返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。class Node { public int val; public List<Node> neighbors;}测试用例格式:简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。...原创 2022-03-03 16:48:53 · 68 阅读 · 0 评论 -
417. 太平洋大西洋水流问题
力扣有一个 m × n 的长方形岛屿,与 太平洋 和 大西洋 相邻。“太平洋”处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。这个岛被分割成一个个方格网格。给定一个 m x n 的整数矩阵heights,heights[r][c]表示坐标 (r, c) 上单元格 高于海平面的高度 。岛上雨水较多,如果相邻小区的高度 小于或等于 当前小区的高度,雨水可以直接向北、南、东、西流向相邻小区。水可以从海洋附近的任何细胞流入海洋。返回 网格坐标 result的 2D列...原创 2022-03-03 16:09:49 · 78 阅读 · 0 评论 -
65. 有效数字
力扣有效数字(按顺序)可以分成以下几个部分:一个 小数 或者 整数(可选)一个 'e' 或 'E' ,后面跟着一个 整数小数(按顺序)可以分成以下几个部分:(可选)一个符号字符('+' 或 '-')下述格式之一:至少一位数字,后面跟着一个点 '.'至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字一个点 '.' ,后面跟着至少一位数字整数(按顺序)可以分成以下几个部分:(可选)一个符号字符('+' 或 '-')至少一位数字部分有效数字列举如下:["2", "00原创 2022-03-03 14:23:26 · 223 阅读 · 0 评论 -
图的深度与广度优先遍历
深度优先访问根节点对根节点的没访问过的相邻节点挨个进行深度优先遍历广度优先新建一个队列,把根节点入队把队头出队并访问把队头的没访问过的相邻节点入队重复第二、三步,直到队列为空const graph = { 0: [1, 2], 1: [2], 2: [0, 3], 3: [3]}/* 深度优先 访问根节点 对根节点的没访问过的相邻节点挨个进行深度优先遍历*/const visited = new Set()f.原创 2022-03-03 11:16:35 · 99 阅读 · 0 评论 -
112. 路径总和
力扣给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true解释:等于目标和的根节点到叶节点路径如上图所示。示例原创 2022-03-02 17:01:41 · 40 阅读 · 0 评论 -
111. 二叉树的最小深度(广度优先遍历)
力扣给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 1:输入:root = [3,9,20,null,null,15,7]输出:2示例 2:输入:root = [2,null,3,null,4,null,5,null,6]输出:5解题思路求最小深度,考虑使用广度优先遍历。在广度优先遍历过程中,遇到叶子节点,停止遍历,返回节点层级。1原创 2022-03-02 13:18:31 · 301 阅读 · 0 评论 -
二叉树的前中后序遍历
11原创 2022-03-02 11:55:44 · 157 阅读 · 0 评论