![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
常见算法题归纳
主要包括力扣的每日一题,python3的详细解法
Nakisha
这个作者很懒,什么都没留下…
展开
-
(力扣每日一题)不同路径 II
不同路径 II一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m 和 n 的值均不超过 100。解题思路动态规划1、第[i, j]个格子的总数应该等于[i - 1, j] + [i, j -1]2、dp[i][j] 表示 到格子原创 2020-07-06 15:39:39 · 249 阅读 · 0 评论 -
(力扣每日一题) 通配符匹配
通配符匹配给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘’ 的通配符匹配。‘?’ 可以匹配任何单个字符。'’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。示例 1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa”p =原创 2020-07-05 22:59:31 · 286 阅读 · 0 评论 -
(力扣每日一题)路径总和
路径总和给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。解题思路1、使用广度优先搜索的方式,记录从根节点到当前节点的路径和。2、使用两个队列,分别存储将要遍历的节点,以及根节点到这些节点的路径和。代码class Solution: def hasPathSum(self, root: TreeNode, sum: int) -> bool: if not root:原创 2020-07-07 22:44:10 · 188 阅读 · 0 评论 -
(力扣每日一题)最长有效括号
最长有效括号给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: “(()”输出: 2解释: 最长有效括号子串为 “()”示例 2:输入: “)()())”输出: 4解释: 最长有效括号子串为 “()()”解题思路从前往后遍历字符串一、入栈条件为:1.栈为空2.当前字符是’(’3.栈顶符号位’)’因为三种条件都没办法消去成对的括号。二、计算结果:符合消去成对括号时,拿当前下标减去栈顶下标即可代码class Solution:原创 2020-07-04 22:59:14 · 202 阅读 · 0 评论 -
(力扣每日一题)将有序数组转换为二叉搜索树
将有序数组转换为二叉搜索树将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \-3 9/ /-10 5解题思路1、由题意得知数组是按照升序排列的有序数列,所以可以确保数组是二叉搜索树的中序遍历序列。(二叉搜索树的中原创 2020-07-03 17:54:10 · 201 阅读 · 0 评论 -
(力扣每日一题)有序矩阵中第K小的元素
最长重复子数组给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。说明:1 <= len(A), len(B) <= 10000 <= A[i], B[i] < 100解题思路1、利用滑动窗口将两个数值进行对齐,最长重复子数组在 A 和 B 中的开始位置相同,我们就可以对这两个数组进行一次遍历,得到子数组的长度。2、对齐的方式有两类:第一类为 A 不变,B 的首元素与 A 中的某个元素对齐;第二类为 B 不变,A 的首元素与 B 中的某个元素对齐原创 2020-07-03 16:37:05 · 161 阅读 · 0 评论 -
(力扣每日一题)最长重复子数组
最长重复子数组给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。说明:1 <= len(A), len(B) <= 10000 <= A[i], B[i] < 100解题思路1、利用滑动窗口将两个数值进行对齐,最长重复子数组在 A 和 B 中的开始位置相同,我们就可以对这两个数组进行一次遍历,得到子数组的长度。2、对齐的方式有两类:第一类为 A 不变,B 的首元素与 A 中的某个元素对齐;第二类为 B 不变,A 的首元素与 B 中的某个元素对齐原创 2020-07-03 16:35:25 · 246 阅读 · 0 评论 -
(力扣每日一题)用两个栈实现队列
用两个栈实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )解题思路1、栈无法实现队列功能: 栈底元素(对应队首元素)无法直接删除,需要将上方所有元素出栈。2、双栈可实现列表倒序: 设有含三个元素的栈 A = [1,2,3]和空栈 B = []。若循环执行 A 元素出栈并添加入栈 B ,直到栈 A 为空,则 A=[] , B原创 2020-07-03 16:34:00 · 329 阅读 · 0 评论 -
(力扣每日一题)数组中第K个最大的元素
数组中第K个最大的元素在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。解题思路用堆排序来解决这个问题——建立一个大根堆,做 k - 1次删除操作后堆顶元素就是我们要找的答案。1、构建一棵完全二叉树,从第一个非叶子节点为根节点的子树开始,将其调整为大根堆。2、调整倒数第二个非叶子节点作为根节点的子树,调整倒数第三个非叶子节点作为根节点的子树…调整倒数第K个非叶子节点作为根节点的子树,直到调整完成。3、删除k-1次堆顶元素(原创 2020-07-03 16:31:12 · 228 阅读 · 0 评论 -
(力扣每日一题)两数之和
两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]解题思路通过字典建立哈希表的方式把数据输入判断。代码class Solution: def twoSum(self, n原创 2020-07-03 16:28:11 · 168 阅读 · 0 评论 -
(力扣每日一题)缺失的第一个正数
文章目录1、缺失的第一个正数两数之和1、缺失的第一个正数给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。要求:你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。(时间复杂度为 O(N)O(N),空间复杂度为 O(1)。)解题思路方法一:哈希表1、将数组所有的数放入哈希表,随后从 11 开始依次枚举正整数,并判断其是否在哈希表中。2、对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1, N+1]中。3、将数组设计成哈希表的思路:对数组进行遍历,对于原创 2020-07-01 14:44:34 · 214 阅读 · 0 评论 -
(力扣每日一题)判断子序列
判断子序列给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。解题思路双指针1、s 是否是 t 的子序列,因此只要能找到任意一种 s 在 t中出现的方式,即可认为 s 是 t 的原创 2020-07-27 11:11:08 · 747 阅读 · 0 评论 -
(力扣每日一题)分割数组的最大值
分割数组的最大值给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。注意:数组长度 n 满足以下条件:1 ≤ n ≤ 10001 ≤ m ≤ min(50, n)解题思路方法一动态规划1、令 f[i][j]表示将数组的前 i个数分割为 j 段所能得到的最大连续子数组和的最小值。2、进行状态转移时,我们可以考虑第 j段的具体范围,即我们可以枚举 k,其中前 k个数被分割为 j-1 段,而第 k+1到第 i 个原创 2020-07-25 14:20:27 · 592 阅读 · 0 评论 -
(力扣每一题)除数博弈
除数博弈爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:选出任一 x,满足 0 < x < N 且 N % x == 0 。用 N - x 替换黑板上的数字 N 。如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。解题思路归纳法1、最终结果应该是占到 2 的赢,占到 1 的输;2、若当前为奇数,奇数的约数只能原创 2020-07-24 11:30:59 · 152 阅读 · 0 评论 -
(力扣每日一题)最小路径和
最小路径和给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。解题思路动态规划1、由于路径的方向只能是向下或向右,因此网格的第一行的每个元素只能从左上角元素开始向右移动到达。2、网格的第一列的每个元素只能从左上角元素开始向下移动到达,此时的路径是唯一的。3、因此每个元素对应的最小路径和即为对应的路径上的数字总和。4、对于不在第一行和第一列的元素,可以从其上方相邻元素向下移动一步到达,或者从其左方相邻元素原创 2020-07-23 08:23:03 · 389 阅读 · 0 评论 -
(力扣每日一题)不同的二叉搜索树 II
不同的二叉搜索树 II给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。提示:0 <= n <= 8解题思路二叉搜索树有以下几个特点:(1)、左边的小于当前;(2)、右边的大于当前;(3)、没有重复的值。为了符合二叉搜索树的这几个特点,我们需要知道当前的范围。(要知道开头和结尾;最开始是1和n)1、首先定义一个字典保存已遍历的参数和结果以免重复。2、特殊情况判断:如果n == 0,返回[],如果不判断则会返回[None](执行递归代码会直接返回,因为原创 2020-07-21 18:15:21 · 159 阅读 · 0 评论 -
(力扣每日一题)两数之和 II - 输入有序数组
两数之和 II - 输入有序数组给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。解题思路方法一:二分查找在数组中找到两个数,使得它们的和等于目标值,可以首先固定第一个数,然后寻找第二个数,第二个数等于目标值减去第一个数的差。利用数原创 2020-07-20 11:05:58 · 220 阅读 · 0 评论 -
(力扣每日一题)戳气球
戳气球有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。求所能获得硬币的最大数量。说明:你可以假设 nums[-1] = nums[n] = 1,但注意它们不是真实原创 2020-07-19 16:03:44 · 304 阅读 · 0 评论 -
(力扣每日一题)交错字符串
交错字符串给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。解题思路动态规划(来源力扣)(1)开数组我们使用dp[i][j]表示s1的前i个字符和s2的前j个字符是否能构成s3的前i+j个字符。首先,dp[0][0]一定是True。(2)初始化1、初始化s1,s2,s3的长度分别为len1,len2,len32、若len1+len2!=len3,表示一定不能构成交错字符串,返回False3、初始化dp为(len1+1)*(len2+1)的Fals原创 2020-07-18 16:11:15 · 239 阅读 · 0 评论 -
(力扣每日一题)搜索插入位置
搜索插入位置给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。解题思路1.对极端情况进行判断,当target比数组中的任意一个数都小或都大;2.对target是否在数组中进行判断3.当在数组中的时候,找到其下标位置(默认数组为无重复数组)4.当没有在数组中的时候,找到第一个数字比target大的元素,这个元素的下标位置就是target插入数组的位置。代码class Solution:原创 2020-07-17 13:03:11 · 297 阅读 · 0 评论 -
(力扣每日一题)判断二分图
判断二分图给定一个无向图graph,当这个图为二分图时返回true。如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。解题思路1、设任意两个节点 u 和 v,如果它们之间有原创 2020-07-16 13:12:55 · 516 阅读 · 0 评论 -
(力扣每日一题)不同的二叉搜索树
不同的二叉搜索树给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?解题思路动态规划1、假设n个节点存在2、令G(n)的从1到n可以形成二叉排序树个数3、令f(i)为以i为根的二叉搜索树的个数即有:G(n) = f(1) + f(2) + f(3) + f(4) + … + f(n)4、n为根节点,当i为根节点时,其左子树节点个数为[1,2,3,…,i-1],右子树节点个数为[i+1,i+2,…n],所以当i为根节点时,其左子树节点个数为i-1个,右子树节点为n-i,即f(原创 2020-07-15 12:25:26 · 466 阅读 · 0 评论 -
(力扣每日一题)三角形最小路径和
三角形最小路径和给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。在本题中,给定的三角形的行数为 n,并且第 i行(从 0 开始编号)包含了 i+1个数。如果将每一行的左端对齐,那么会形成一个等腰直角三角形,如下所示:解题思路动态规划1、用 f[i][j]] 表示从三角形顶部走到位置 (i, j)的最小路径和。这里的位置 (i,j) 指的是三角形中第 i 行第原创 2020-07-14 19:43:24 · 337 阅读 · 0 评论 -
(力扣每日一题)两个数组的交集 II
两个数组的交集 II给定两个数组,编写一个函数来计算它们的交集。说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。我们可以不考虑输出结果的顺序。解题思路方法一:哈希表1、选择用哈希表存储每个数字出现的次数。原因:同一个数字在两个数组中都可能出现多次,但我们最终选择该数字在交集中出现的次数为该数字在两个数组中出现次数的最小值。2、具体步骤:(1)、选择两个数组中长度较小的为第一个数组进行哈希映射。(2)、遍历第一个数组,并在哈希表中记录第一个数组中的每个数字以及对原创 2020-07-13 14:02:13 · 596 阅读 · 0 评论 -
(力扣每日一题) 地下城游戏
地下城游戏一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将原创 2020-07-12 12:47:04 · 450 阅读 · 0 评论 -
(力扣每日一题)计算右侧小于当前元素的个数
计算右侧小于当前元素的个数给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。原创 2020-07-11 23:34:22 · 588 阅读 · 0 评论 -
(力扣每日一题). 最佳买卖股票时机含冷冻期
最佳买卖股票时机含冷冻期给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。解题思路定位思考「买入」为负收益,而「卖出」为正收益。在初入股市时,你只有「买入」的权利,只能获得负收益。而当你「买入」之后,你就有了「卖出」的权利,可以获得正收益。显然,我们需要尽原创 2020-07-10 23:10:37 · 264 阅读 · 0 评论 -
(力扣每日一题)恢复空格
恢复空格哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!“已经变成了"iresetthecomputeritstilldidntboot”。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。解题思路动态规划1、原创 2020-07-09 13:47:56 · 204 阅读 · 0 评论 -
(力扣每日一题)跳水板
跳水板你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。返回的长度需要从小到大排列。解题思路(来源力扣官解)1、先考虑特殊情况当k = 0时,返回[ ],当shorter = longer 时,返回[ k*shorter ]2、图解分析(研究规律得出使用等差数列方法):设k = 3,当shorter = 1,longer = 1 时的返回值。当longer原创 2020-07-08 15:30:07 · 836 阅读 · 0 评论