算法训练营题目
22333
Botto__Mmmm
这个作者很懒,什么都没留下…
展开
-
LeetCode 1091 二进制矩阵中的最短路径
题目在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1)。一条从左上角到右下角、长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, …, C_k 组成:相邻单元格 C_i 和 C_{i+1} 在八个方向之一上连通(此时,C_i 和 C_{i+1} 不同且共享边或角)C_1 位于 (0, 0)(即,值为 grid[0][0])C_k 位于 (N-1, N-1)(即,值为 grid[N-1][N-1])如果 C_i 位于 (r, c),则 grid[r][c原创 2020-09-14 10:02:41 · 211 阅读 · 0 评论 -
LeetCode 127 单词接龙
题目给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。解法一这个采用BFS来进行转换查询,一层一层的往外扩散,直到查询到最短的原创 2020-09-10 10:48:01 · 83 阅读 · 0 评论 -
LeetCode 37 解数独
题目编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。注意:给定的数独序列只包含数字 1-9 和字符 ‘.’ 。你可以假设给定的数独只有唯一解。给定数独永远是 9x9 形式的。解法本道题类似于八皇后问题,在填充的位置放入1~9 数字,能放入的就继续往下走继续放,如果放的数字导致后面的不能放入就进行回溯原创 2020-09-09 11:00:24 · 90 阅读 · 0 评论 -
LeetCode 36 有效的数独
题目判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。思路就是遍历整个表格,看是否有重复的数字class Solution { public boolean isValidSudoku(char[][] board) { int[][] rows = new int[9][9]; in原创 2020-09-06 14:02:10 · 73 阅读 · 0 评论 -
字典树基本实现及特性
字典树 Trie又称单词查找树或者键树,是一种树形结构。典型应用是用于统计和排序大量的字符串(不仅限于字符串),经常被搜索系统用于文本词频统计它的优点是:最大限度的减少无谓的字符串比较,查询效率比哈希表高。基本性质结点本身不存完整单词从根结点到某一结点,路径上经过的字符连接起来,为该结点所对应的字符串每个结点所有的子结点路劲代表的字符都不同核心思想Trie树核心思想为空间换时间利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。字典树的Java实现...原创 2020-08-08 13:40:49 · 212 阅读 · 0 评论 -
LeetCode 198 打家劫舍
题目你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2,7,9原创 2020-08-05 17:24:06 · 114 阅读 · 0 评论 -
LeetCode 322 零钱兑换
题目给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例 1:输入: coins = [1, 2, 5], amount = 11输出: 3 解释: 11 = 5 + 5 + 1示例 2:输入: coins = [2], amount = 3输出: -1思路 动态规划,自底向上首先,如何去考虑动态规划,怎么将这个问题拆分为重复的子问题然后,定义dp状态方程dp[i原创 2020-08-04 20:07:40 · 127 阅读 · 0 评论 -
LeetCode 53 最大子序和
题目给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。算法1 贪心算法class Solution { public int maxSubArray(int[] nums) { if(nums == null) return null; int maxsum = nums[0];原创 2020-05-27 20:15:53 · 84 阅读 · 0 评论 -
LeetCode 120 三角形最小路径和
题目给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。思路一 暴力搜索对于一个位置来说,它的最小路径和 就是 自身加上 它所选择俩边中的最小路径。这样可以 写出递归搜索c原创 2020-08-02 03:41:32 · 98 阅读 · 0 评论 -
LeetCode 1143 最长公共子序列
题目给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。示例 1:输入:text1 = "abcde", text2 = "原创 2020-07-29 18:13:10 · 122 阅读 · 0 评论 -
LeetCode 63 不同路径二
题目一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?思路 动态规划和前面62题思路一样,就是需要加一个判断的条件是否有障碍物class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) {原创 2020-07-28 14:52:03 · 75 阅读 · 0 评论 -
LeetCode 62 不同路径
题目一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?思路 动态规划动态规划,寻找状态转移方程,就是递推公式。找到重复的最近子问题需要存储中间结果这个题目的话,类似斐波拉契数,自底向上的进行思考递归。当前格子到终点的路线个数,等于下面和右边格子路线个数相加这样,可以直接递归,然后很多格子是重复计算的,所以用一个二维数组,存储计算原创 2020-07-28 13:21:46 · 66 阅读 · 0 评论 -
LeetCode 33 搜索旋转排序数组
题目假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0输出: 4示例 2:输入: nums = [4,5,6,7,0,1,2], targ原创 2020-07-26 01:59:18 · 93 阅读 · 0 评论 -
367 有效的完全平方数
题目给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。示例 1:输入:16输出:True示例 2:输入:14输出:False思路一 二分查找设置上下界,然后进行判断class Solution { public boolean isPerfectSquare(int num) { if (num == 1) return true; int l = 2, r = num;原创 2020-07-24 16:18:39 · 57 阅读 · 0 评论 -
LeetCode 69 X的平方根
题目实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。思路一,二分查找使用二分查找,首先明白二分查找的条件目标函数需要单调性有确定是上下界可以通过索引访问这个题目可以在 1~X的范围中去寻找这个x的平方根。代码来官方题解原创 2020-07-24 14:56:13 · 74 阅读 · 0 评论 -
LeetCode 55 跳跃游戏
题目给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个示例 1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。思路一设置一个原创 2020-07-20 01:22:15 · 61 阅读 · 0 评论 -
LeetCode 122买卖股票的最佳时机Ⅱ
题目给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(原创 2020-07-19 23:54:39 · 84 阅读 · 0 评论 -
LeetCode 455 分发饼干
题目假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。注意:你可以假设胃口值为正。一个小朋友最多只能拥有一块饼干。思路分发饼干 想法就是每一次都给孩子最小合适的饼干。太小的饼干不满足孩子胃口原创 2020-07-18 20:19:28 · 98 阅读 · 0 评论 -
LeetCode 200 岛屿数量
题目你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:[['1','1','1','1','0'],['1','1','0','1','0'],['1','1','0','0','0'],['0','0','0','0','0']]输出: 1示例 2:输入:[['1','1','0','0','0'],['原创 2020-07-16 19:22:26 · 89 阅读 · 0 评论 -
LeetCode 433 最小基因变化
题目一条基因序列由一个带有8个字符的字符串表示,其中每个字符都属于 “A”, “C”, “G”, "T"中的任意一个。假设我们要调查一个基因序列的变化。一次基因变化意味着这个基因序列中的一个字符发生了变化。例如,基因序列由"AACCGGTT" 变化至 “AACCGGTA” 即发生了一次基因变化。与此同时,每一次基因变化的结果,都需要是一个合法的基因串,即该结果属于一个基因库。现在给定3个参数 — start, end, bank,分别代表起始基因序列,目标基因序列及基因库,请找出能够使起始基因序列原创 2020-07-16 00:51:19 · 247 阅读 · 0 评论 -
LeetCode 102 二叉树的层序遍历
题目给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]]算法思路层序遍历,关于BFS广度优先搜索。使用队列来实现。输出时,还需要分层,一层一层的输出。所以我们还需要一个标记,来标记队列里那些的同一层的。直接看代码,有注释代码class Solution {原创 2020-05-25 09:58:54 · 115 阅读 · 0 评论 -
LeetCode 51 N皇后
方法1:回溯在建立算法之前,我们来考虑两个有用的细节。一行只可能有一个皇后且一列也只可能有一个皇后。这意味着没有必要再棋盘上考虑所有的方格。只需要按列循环即可。对于所有的主对角线有 行号 + 列号 = 常数,对于所有的次对角线有 行号 - 列号 = 常数.这可以让我们标记已经在攻击范围下的对角线并且检查一个方格 (行号, 列号) 是否处在攻击位置。现在已经可以写回溯函数 backtrack(row = 0).从第一个 row = 0 开始.循环列并且试图在每个 column 中放置皇后.原创 2020-07-13 00:48:37 · 77 阅读 · 0 评论 -
LeetCode 17 电话号码的字母组合
题目给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].思路一 递归+回溯将数字对应的字符串,都存储在hash表中第一个数字时,枚举它所有的字符第二个数字,继续在第一个数字的枚举上 继续枚举,形成字符串,一直到数字遍历结束class Solution { pub原创 2020-07-07 18:58:03 · 69 阅读 · 0 评论 -
LeetCode 169 多数元素 和Map.Entry
题目给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。思路一 暴力使用hash表来记录数组的元素,和出现个数k-v,k表示数组的元素,v表示元素出现的个数然后遍历哈希表,找到v最大的那个键值class Solution { public int majorityElement(int[] nums) { Map<Integer, Integer>原创 2020-07-07 16:40:50 · 153 阅读 · 0 评论 -
LeetCode 78 子集
题目给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]思路一 回溯法(运用递归)首先,回溯法是一种探索所有潜在可能性找到解决方案的算法。如果当前方案不是正确的解决方案,或者不是最后一个正确的解决方案,则回溯法通过修改上一步的值继续寻找解决方案。这道题思路原创 2020-07-07 10:40:46 · 80 阅读 · 0 评论 -
LeetCode 50 pow(x, n)
题目实现 pow(x, n) ,即计算 x 的 n 次幂函数。说明-100.0 < x < 100.0n 是 32 位有符号整数,其数值范围是 [−231, 231-1 ] 。思路一 暴力循环class Solution { public double myPow(double x, int n) { if (n == 0) { return 1; } double res = 1.0;原创 2020-07-06 17:53:14 · 66 阅读 · 0 评论 -
LeetCode 22 括号生成
题目数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。思路一使用递归来实现我们往一个空的字符串里添加左右括号添加左括号条件(左括号个数小于总对数)添加右括号条件(已经添加的左括号个数大于右括号个数)当添加完括号后,将字符串加入数组中,就是一种可能了,同时终止递归class Solution { public List<String> generateParenthesis(int n) { List<S原创 2020-07-04 23:55:13 · 88 阅读 · 0 评论 -
递归
递归 Recursion递归-循环通过函数体来进行的循环java递归模板public void recur (int level, int param) { if (level > Max_level) { //递归终止条件 return; } process(level,param); //处理当前层的逻辑 recur(level:level+1, new_param); //下探到下一层原创 2020-07-04 15:34:35 · 95 阅读 · 0 评论 -
LeetCode 590 N叉树的后序遍历
题目给定一个 N 叉树,返回其节点值的后序遍历。比如给定一个节点U,其子节点V1,V2,V3, 那么他的后序遍历顺序为[V1的子节点,V1,V2的子节点,V2,V3的子节点,V3,U]思路一迭代手动维护一个栈,然后将根结点放入根结点拿出来,放入其子结点顺序为V1,V2,V3拿出栈顶元素,就是V3,然后放入V3的子节点以此类推这样的遍历顺序为[U,V3,V3的子节点,V2,V2的子节点,V1,V1的子节点]遍历顺序相反一些,就是其后序遍历顺序代码class Solution {原创 2020-07-03 00:13:18 · 143 阅读 · 0 评论 -
LeetCode 144 二叉树的前序遍历
题目给定一个二叉树,返回它的 前序 遍历。思路一 递归class Solution { //递归 public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); helper(root, list); return list; } public void he原创 2020-07-01 21:22:04 · 52 阅读 · 0 评论 -
LeetCode 94 二叉树的中序遍历
题目给定一个二叉树,返回它的中序遍历。思路一 递归 class Solution { public List < Integer > inorderTraversal(TreeNode root) { //递归 List < Integer > res = new ArrayList <> (); helper(root, res); return res; } public void he原创 2020-06-30 20:57:10 · 87 阅读 · 0 评论 -
LeetCode 1 两数之和
题目给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。思路一 暴力直接两重for循环判断代码class Solution { public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for原创 2020-06-24 22:49:43 · 80 阅读 · 0 评论 -
LeetCode 49 字母异位词分组
题目给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"]输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]说明:所有输入均为小写字母。不考虑答案输出的顺序。思路一创建一个boolean数组,长度为给定数组的长度。用来记录数组中字符串是否已经加入了其他异位词类型中遍历整个给定数组,如果这个原创 2020-06-24 21:31:18 · 80 阅读 · 0 评论 -
LeetCode 242 有效的字母异位词
题目给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false说明:你可以假设字符串只包含小写字母。思路一暴力将俩个字符串转换为数组,然后对俩个数组进行排序。这样异位词就会相等,就能进行equals来判断代码class Solution { public boolean isAnag原创 2020-06-24 18:34:01 · 101 阅读 · 0 评论 -
LeetCode 24两两交换链表的节点
题目给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.思路一 递归class Solution { public ListNode swapPairs(ListNode head) { if (head == null || head.next == null) { retu原创 2020-06-19 20:14:17 · 102 阅读 · 0 评论 -
LeetCode 206反转链表
题目反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL如果是思路一 迭代遍历链表时,将每一个结点指向上一个结点,还需要一个变量来记住下一个结点class Solution { public ListNode reverseList(ListNode head) { ListNode pre = null; List原创 2020-06-19 16:56:52 · 76 阅读 · 0 评论 -
LeetCode 239 滑动窗口最大值
题目给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7原创 2020-06-15 21:01:13 · 90 阅读 · 0 评论 -
LeetCode 84 柱状图中的最大矩形
题目给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。思路1 暴力解法遍历每一个高度,求每个高度的最大面积在每个高度时,向左右遍历,获取它的左右边界,然后计算面积class Solution { //暴力法,遍历每个高度 ,求最大面积 public原创 2020-06-15 14:42:15 · 265 阅读 · 0 评论 -
LeetCode 155 最小栈
题目设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。思路这里主要是需要比原本的栈多出一个功能,就是常数时间内能检索栈中的最小元素。主要是如何能记住栈中最小元素,这个问题就迎刃而解了这里可以有三种方法使用额外的栈,用来存放最小元素在同一个栈中,标记最小元素,因为当抛出元素是最小元素时,需要记录之后原创 2020-06-15 13:28:50 · 61 阅读 · 0 评论 -
LeetCode 20 有效的括号
题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例 2:输入: "()[]{}"输出: true示例 3:输入: "(]"输出: false示例 4:输入: "([)]"输出: false示例 5:输入: "{[]}"输出: true思路1因为有效原创 2020-06-14 23:23:24 · 88 阅读 · 0 评论