
算法题
小风_
致力于严谨、有趣的AI算法
展开
-
【回溯】全排列 II leetcode47
全排列II原创 2022-06-06 23:41:34 · 264 阅读 · 0 评论 -
【回溯】全排列 leetcode46
全排列原创 2022-06-05 23:20:42 · 219 阅读 · 0 评论 -
算法题:组合总和leetcode39
题目链接https://leetcode.cn/problems/combination-sum/给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 15原创 2022-05-26 23:39:22 · 155 阅读 · 0 评论 -
【动态规划】不同的二叉搜索树
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。链接:https://leetcode-cn.com/problems/unique-binary-search-trees/定义:dp[i]dp[i]dp[i]表示从节点为iii个的互不相同的二叉搜索树的种数边界条件:dp[0]=1,dp[1]=1,dp[2]=2dp[0]=1,dp[1]=1,dp[2]=2dp[0]=1,dp[1]=1,dp[2]=2,没有节.原创 2021-08-03 15:50:02 · 252 阅读 · 0 评论 -
【动态规划】杨辉三角
给定一个非负整数 *numRows,*生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。链接:https://leetcode-cn.com/problems/pascals-triangle/定义:dp[i][j]dp[i][j]dp[i][j]表示索引位置i,ji,ji,j的值边界条件:dp[0][0]=1,dp[1][0]=dp[1][1]=1dp[0][0]=1,dp[1][0]=dp[1][1]=1dp[0][0]=1,dp[1][0].原创 2021-08-02 16:28:57 · 325 阅读 · 0 评论 -
【动态规划】最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。参考链接https://leetcode-cn.com/problems/longest-increasing-subsequence/定义:dp[i]dp[i]dp[i]示从0到iii为止最长的递增子序列边界条件:dp[i]=1,idp[i]=1,idp[i]=1,i从000到N−.原创 2021-07-26 11:35:49 · 246 阅读 · 0 评论 -
【动态规划】三角形最小路径和
链接 https://leetcode-cn.com/problems/triangle/给定一个三角形 triangle ,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。定义:dp[i][j]dp[i][j]dp[i][j]表示从索引号(0,0)(0,0)(0,0)到索引号(i,j).原创 2021-07-22 15:19:14 · 129 阅读 · 0 评论 -
【动态规划】不同路径2
链接 https://leetcode-cn.com/problems/unique-paths-ii一个机器人位于一个 m x n 网格的左上角,机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?定义:dp[i][j]dp[i][j]dp[i][j]表示从索引号(0,0)(0,0)(0,0)到索引号(i,j)(i,j)(i,j)的路径走法的数量边界:第一行和第一列,dp[0][0]dp[0][0]dp[0][0].原创 2021-07-21 11:00:45 · 163 阅读 · 0 评论 -
【动态规划】不同路径
链接 https://leetcode-cn.com/problems/unique-paths/一个机器人位于一个 m x n 网格的左上角 。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径?定义:dp[i][j]dp[i][j]dp[i][j]表示从索引号(0,0)(0,0)(0,0)到索引号(i,j)(i,j)(i,j)的路径走法的数量边界:第一行和第一列,dp[0][0]dp[0][0]dp[0][0]只能是1。同时,由于只能下走或右走,因此第.原创 2021-07-21 10:51:52 · 114 阅读 · 0 评论 -
【动态规划】最小路径和
链接 https://leetcode-cn.com/problems/minimum-path-sum/给定一个包含非负整数的 m x n网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:**每次只能向下或者向右移动一步。定义:dp[i][j]dp[i][j]dp[i][j]表示从索引号(0,0)(0,0)(0,0)到索引号(i,j)(i,j)(i,j)的最小路径和边界:第一行和第一列,dp[0][0]dp[0][0]dp[0][0]只能是grid[0][0.原创 2021-07-20 10:41:27 · 187 阅读 · 0 评论 -
【动态规划】买卖股票的最佳时机
链接https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/定义:dp[i]dp[i]dp[i]表示当前可达到的最大的价格边界:dp[0]=0dp[0] = 0dp[0]=0状态转移方程:dp[i]=max(dp[i−1],nums[i]−PreMinPrice)dp[i] = max(dp[i-1], nums[i]-PreMinPrice)dp[i]=max(dp[i−1],nums[i]−PreMinPrice),Pr.原创 2021-07-19 09:42:46 · 114 阅读 · 0 评论 -
【动态规划】LCS最长公共子序列
链接 https://leetcode-cn.com/problems/longest-common-subsequence/定义:dp[i][j]dp[i][j]dp[i][j]表示字符串 a\operatorname aa 从索引 000 到索引 iii ,和字符串 b\operatorname bb 从索引 000 到索引 jjj 的最长公共子序列边界:第一行和第一列可以通过状态转移方程进行初始化状态转移方程:dp[i][j]={dp[i−1][j−1]+1,a[i]=b[j]max.原创 2021-07-18 11:46:34 · 130 阅读 · 0 评论 -
【动态规划】接雨水
leetcode链接https://leetcode-cn.com/problems/trapping-rain-water/给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。如下图,本题重要的不是动态规划的思想,而是几何思维解题的方法step1.从左向右遍历找到最大step2.从右向左遍历找到最大step3.加起来,并删去多余的部分定义:dp_left[i]表示从左向右当前最大值,dp_right[i]表示从右向左当前最大值边界:可不定.原创 2021-07-17 10:34:43 · 199 阅读 · 0 评论 -
【动态规划】最大子序列和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。例如:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。参考链接https://leetcode-cn.com/problems/maximum-subarray/动态规划定义:dp[i]dp[i]dp[i]表示从索引0开始到iii最大,如果是,True,否则,False边界条件:dp[0]=num.原创 2021-07-16 17:27:29 · 291 阅读 · 2 评论 -
【动态规划】最长回文子串
链接https://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af定义:dp[i][j]dp[i][j]dp[i][j]表示iii到jjj是否为回文,如果是,True,否则,False边界条件:dp[i][i]=Truedp[i][i]=Truedp[i][i]=True状态转移方程:如果dp[left+1][right−1]dp[left+1][right-1]dp[left+1][right−1]为TrueTrueTrue.原创 2021-07-15 16:54:06 · 112 阅读 · 0 评论 -
【动态规划】爬楼梯
爬楼梯,一次性可以爬一阶或两阶,问爬n阶有多少种方法递归from functools import lru_cachefrom fastcache import clru_cache@lru_cache(32)def climb_stairs(n: int) -> int: fmt = "需要输入正数,然而你输入的是{}" assert isinstance(n, int) and n > 0, fmt.format(n) if n == 1: .原创 2021-07-15 16:31:59 · 107 阅读 · 0 评论 -
【动态规划】阶乘
a的阶乘表示从1开始连乘到a的值,注:0的阶乘为1递归from functools import lru_cache #缓存机制,加快速度from fastcache import clru_cache@lru_cache(32)def factorial(num: int) -> int: if num < 0: raise ValueError("不可为负数") return 1 if num in (0, 1) else num * fa.原创 2021-07-15 16:04:13 · 663 阅读 · 0 评论 -
【树】求先序排列(不构造树的递归方法)
链接:https://ac.nowcoder.com/acm/problem/16692思路可以发现,后序排序的最后一个结点是根节点,以此可以对中序字符串进行拆分,根据根节点和中序排列找到左子树和右子树,然后继续递归,每次递归的时候将根节点打印出来就行了。def tree(s1,s2): lens = len(s1) if(lens>0): prin...原创 2020-03-05 19:37:00 · 164 阅读 · 0 评论 -
【字符串】FBI树
题目链接:https://ac.nowcoder.com/acm/problem/16660思路:题目要让我们做的是,将01构成的字符串转换为由BIF字符构成的树的后序遍历。首先,(拿10001011做例子)根节点为F,原因是10001011即包含0又包含,然后第一次将字符串二分,成为1000+1010,左子树为F(1000),右子树为F(1010)第二次进行二分,成为10+00 ,变...原创 2020-03-04 10:48:31 · 318 阅读 · 0 评论 -
【字符串】中缀表达式转后缀表达式并求值(python)
字符串表达式求值对于python而言,有一个很方便的方法:eval(),可以直接求出得到结果,这里我想利用python手写实现一个,即利用stack和中缀表达式转后缀表达式方法来求中缀表达式转后缀表达式发现这个方法的人真是个人才…后缀表达式又叫逆波兰式(Reverse Polish notation),中缀转后缀思路也不麻烦,只要学过数据结构和算法的同学几乎都会学习这一块内容。转为后缀表达...原创 2020-03-01 18:21:18 · 1315 阅读 · 0 评论 -
【排序】国王的游戏
题目链接:https://ac.nowcoder.com/acm/problem/16561题目描述恰逢 H 国国庆,国王邀请 n位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左...原创 2019-12-09 10:56:22 · 673 阅读 · 0 评论 -
【排序】图书管理员
题目链接:https://ac.nowcoder.com/acm/problem/16422题目描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数。 每位借书的读者手中有一个需求码,这个需求码也是一个正整数。如果一本书的图书编码恰好以读者的需求码结尾,那么这本书就是这位读者所需要的。 小 D 刚刚当上图书馆的管理员,她知...原创 2019-12-03 21:34:24 · 1094 阅读 · 0 评论