算法
文章平均质量分 55
常用算法,面试必备
阿辉爱睡觉
️️️
展开
-
广度优先搜索练习一
例题一:N叉树得层序遍历1给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。示例 1:输入:root = [1,null,3,2,4,null,5,6]输出:[[1],[3,2,4],[5,6]]层序遍历:广度优先/*// Definition for a Node.class Node { public int val; public List<Node> chil原创 2022-05-10 09:31:08 · 406 阅读 · 0 评论 -
深度优先遍历练习六
例题一:N皇后n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/n-queens[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wbmayqnw-16原创 2022-05-09 09:50:23 · 147 阅读 · 0 评论 -
深度优先搜索练习五
例题一:组合总数给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。来源:力扣(LeetCode)链接:https://leetcode-原创 2022-05-08 22:04:08 · 332 阅读 · 0 评论 -
深度优先搜索练习四
例题一:电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。(九键输入法)给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3rkv8HWI-1651898281742原创 2022-05-07 12:38:39 · 857 阅读 · 0 评论 -
深度优先搜索练习三
例题一:被围绕的区域给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。示例 1:输入:board = [[“X”,“X”,“X”,“X”], [“X”,“O”,“O”,“X”], [“X”,“X”,“O”,“X”], [“X”,“O”,“X”,“X”]]输出:[[“X”,“X”,“X”,“X”], [“X”,“X”,“X”,“X”],原创 2022-05-06 12:14:50 · 136 阅读 · 0 评论 -
深度优先搜索练习二
例题一:图像渲染有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。为了完成 上色工作 ,从初始像素开始,记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应 四个方向上 像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点原创 2022-05-05 09:32:55 · 150 阅读 · 0 评论 -
深度优先搜索练习一
例题一:放牌假如有编号为1~ 3的3张扑克牌和编号为1~3的3个盒子,现在需要将3张牌分别放到3个盒子中去,且每个盒子只能放一张牌,一共有多少种不同的放法。当走到一个盒子面前的时候,到底要放那一张牌呢?在这里应该把所有的牌都尝试一遍。假设这里约定一个顺序,按牌面值从小到大依次尝试。在这样的假定下,当走到第一个盒子的时候,放入1号牌。放好之后,继续向后走,走到第二个盒子面前,此时还剩2张牌,牌面值最小的为2号牌,按照约定的规则,把2号牌放入第二个盒子。此时,来到第三个盒子面前,只剩一张牌,放入第三个原创 2022-05-04 10:03:18 · 539 阅读 · 0 评论 -
回溯算法初识
回溯算法类似枚举的搜索过程,主要是在搜索尝试的过程中寻找问题的解,当发现不满足求解条件时,"回溯"返回,尝试别的路径回溯法是一种选优搜索法,按照选优条件按向前搜索,以达到目标。当探索到某一步时,返现并不是最有解或不能达成目标,就退一步,重新选择,这种走不通就返回上一状态重新选择的方法叫回溯法。满足回溯条件的点叫做回溯点或剪枝点,剪枝:就是将不可能达到目标或没必要的路径剪掉许多复杂的,规模较大的问题都可以使用回溯法,在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深原创 2022-05-03 13:03:57 · 507 阅读 · 0 评论 -
贪心例题系列2
例题一:多机调度问题某工厂有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的加工时间为ti,任何作业在被处理时不能中断,也不能进行拆分处理。现厂长请你给他写一个程序:算出n个作业由m台机器加工处理的最短时间输入第一行T(1<T<100)表示有T组测试数据。每组测试数据的第一行分别是整数n,m(1<=n<=10000,1<=m<=100),接下来的一行是n个整数ti(1<=t<=100)。输出所需的最短时间分析:贪心n个机器可以同时原创 2022-04-28 15:57:57 · 1342 阅读 · 0 评论 -
贪心例题系列1
例题1:跳跃游戏跳跃游戏给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每一元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置示例: [2,3,1,1,4]true; [3,2,1,0,4]false;分析:贪心当前能走的最远距离?[2,3,1,1,4]0 1 2 3 4在0,可以走两步最远到2;在1,可以走三步最远到4;(可以走到)class Solution { public boolean canJump(int[原创 2022-04-27 09:26:21 · 3491 阅读 · 0 评论 -
贪心算法思想
贪心算法思想:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素。当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法求解的关键特征。贪心算法的每一次操作都对结果产生直接影响。贪心算法对每个子问题的解决方案都原创 2022-04-25 10:37:18 · 341 阅读 · 0 评论 -
动归应用——第九题不同的子序列
不同子序列动态规划——困难不同的子序列给定两个字符串S和T,求S有多少个不同的子串与T相同。S的子串定义为在S中任意去掉0个或者多个字符形成的串。子串可以不连续,但是相对位置不能变。比如“ACE”是“ABCDE”的子串,但是“AEC”不是动态规划问题:s中与t相同的子串数量?(可以删除s中任意个字符构成相同子串)状态分析: 子问题:s中前i个字符中与t的前j个字符相同的子串数量(i >= j) f(i,j) :s中前i个字符中与t的前j个字符相同的子串数量状态转移原创 2022-04-24 09:56:26 · 151 阅读 · 0 评论 -
动规应用——第八题编辑距离
编辑距离动态规划——困难编辑距离给定两个单词word1和word2,请计算将word1转换为word2至少需要多少步操作。你可以对一个单词执行以下3种操作:a)在单词中插入一个字符b)删除单词中的一个字符c)替换单词中的一个字符动态规划问题: 单词1 转换为 单词2 最少需要操作几次?(插入,或删除,替换)状态分析: 子问题:单词1的前j个字符 转换为 单词2 的前i个字符,最少需要操作几次? dp(j,i) :单词1的前j个字符 转换为 单词2 的前i个字符,最少原创 2022-04-22 15:00:43 · 216 阅读 · 0 评论 -
动规应用——第七题回文串的分割
回文串分割动态规划——困难回文串分割给出一个字符串s,分割s使得分割出的每一个子串都是回文串计算将字符串s分割成回文分割结果的最小切割数例如:给定字符串s=“aab”,返回1,因为回文分割结果[“aa”,“b”]是切割一次生成的。动态规划问题: 分割字符串,使其每个子串都是回文串,返回最小分割次数状态分析: 子问题:以第i个字符为结尾的字符串,最小分割次数 dp(i) :第i个字符为结尾的字符串,最小分割次数状态转移方程: 第i个字符,是作为单独一个回文子串,还原创 2022-04-22 14:59:34 · 259 阅读 · 0 评论 -
动规应用——第六题背包问题
背包问题动态规划——中等背包问题有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.问最多能装入背包的总价值是多大?A[i], V[i], n, m 均为整数你不能将物品进行切分你所挑选的要装入背包的物品的总大小不能超过 m每个物品只能取一次m <= 1000动态规划:问题: A[] 物品大小 V[] 物品价值,m背包容量,n物品个数,背包总价值多大?状态分析: 子问题:前i个物品放入大小为j的背包中所获得原创 2022-04-22 14:56:33 · 175 阅读 · 0 评论 -
动态规划应用——第五题最小路径和
最小路径和动态规划——中等最小路径和题目描述:给定一个m*n的网格,网格用非负数填充,找到一条从左上角到右下角的最短路径。注:每次只能向下或者向右移动。动态规划问题: 左上角到右下角的最小路径和,只能向下或向右移动状态分析: 子问题:从(0,0)到(i,j)的最小路径和? dp(i,j) : 从(0,0)到(i,j)的最小路径和状态转移方程: dp(i,j) = min(dp(i-1,j) , dp(i,j-1)) + array(i,j) ;初始值: 顶部原创 2022-04-21 17:36:32 · 274 阅读 · 0 评论 -
动态规划——第四题路径总数
不同路径的数目动态规划——简单题目描述:在一个m*n的网格的左上角有一个机器人,机器人在任何时候只能向下或者向右移动,机器人试图到达网格的右下角,有多少可能的路径。动态规划:问题: 从左上角到右下角,只能向下或向右;从(0,0)到(i,j)共有几种路径状态分析: 子问题:从(0,0)到(i,j)的路径数; dp(i,j) : 到(i,j)的路径总数;状态转移方程: dp(i,j) = dp(i,j-1) + dp(i-1,j); 边界: 最顶部:i ==原创 2022-04-21 17:35:42 · 432 阅读 · 0 评论 -
动态规划应用——第三题三角矩阵
三角矩阵动态规划——中等三角形给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字,例如,给出的三角形如下:[[20],[30,40],[60,50,70],[40,10,80,30]]最小的从顶部到底部的路径和是20 + 30 + 50 + 10 = 110。问题:从顶部到底部的最小路径和?状态分析: 子问题:从(0,0)到(i,j)的最小路径和 dp(i,j):到(i,j)最小路径和状态转移方程: dp(i,j) = min原创 2022-04-21 17:34:52 · 869 阅读 · 0 评论 -
动态规划应用第二题拆分词句
字符串分割(Word Break)动态规划——中等拆分词句给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词)。例如:给定s=“nowcode”;dict=[“now”, “code”].返回true,因为"nowcode"可以被分割成"now code".状态分析: 子状态:前1,2,3,…,n个字符能否根据词典中的词被成功分词 dp[i] 以第i个字符结尾的单词原创 2022-04-20 15:44:42 · 233 阅读 · 1 评论 -
动态规划应用-第一题Fibonacci
斐波那契数列动态规划初试——简单斐波那契数列现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n <= 39递归常规解法空间复杂度高,时间复杂度高,易理解public class Solution { public int Fibonacci(int n) { if(n == 0) return 0; if(n == 1) return 1; r原创 2022-04-20 15:43:09 · 216 阅读 · 0 评论 -
动态规划学习
Dynamic ProgrammingDP定义: 动态规划是分治思想的延伸,通俗一点来说就是大事化小,小事化无的艺术。 在将大问题化解为小问题的分治过程中,保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接使用这些结果动态规划具备了以下三个特点:把原来的问题分解成了几个相似的子问题所有的子问题只需要解决一次存储子问题的解动态规划的本质,是对问题状态的定义和状态转移方程的定义(状态以及状态之间的递推关系)动规问题一般从以下四个角度考虑:明确问题状态定义原创 2022-04-20 15:41:34 · 100 阅读 · 0 评论