单源最短路径问题 本篇只考虑无权图的最短路径。问题一:走迷宫问题方案一(dfs + 回溯):方案二(bfs):问题二:单词接龙(leetcode127)解法一(dfs + 回溯):解法二(bfs获得最短路径):问题一:走迷宫问题定义一个二维数组M*Nmaze它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点maze[0][0] = 0,出口点maze[M - 1][N - 1] = 0表示出口入口都是可以走的.
避免洪水泛滥(leetcode1448) 问题描述:你的国家有无数个湖泊,所有湖泊一开始都是空的。当第 n个湖泊下雨的时候,如果第 n个湖泊是空的,那么它就会装满水,否则这个湖泊会发生洪水。你的目标是避免任意一个湖泊发生洪水。给你一个整数数组rains,其中:rains[i] > 0表示第 i天时,第 rains[i]个湖泊会下雨。rains[i] == 0表示第 i天没有湖泊会下雨,你可以选择 一个湖泊并 抽干这个湖泊的水。请返回一个数组ans,满足:ans.length == rains.le...
IP地址和子网掩码的分类统计 一道特别恶心的字符串处理题。问题描述:请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。所有的IP地址划分为A,B,C,D,E五类A类地址1.0.0.0~126.255.255.255;B类地址128.0.0.0~191.255.255.255;C类地址192.0.0.0~223.255.255.255;D类地址224.0.0.0~239.255.255.255;E类地址240.0.0.0~255.255.255.2.
二叉树路径和问题 问题一:二叉树中最大路径和(leetcode124)问题描述:给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。大体思路:其最大路径和有以下四种可能:1) 由当前结点的左子树结点到右子树结点2) 由当前结点到其左子树某一节点3) 由当前结点到其右子树某一节点4) 由当前结点本身分析完可能性发现不能简单的返回当前结点的最大路径和,对于子节点是情况一而言,父节点拿到子结点的路径
分割等和子集 (递归 二维dp 一维dp) 问题描述:给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/partition-equal-subset-sum著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。大体思路:由于想将数组分割为两个和相同的子集,因此可以先获得数组整体的和,然后该问题可以转化为找数组中是否存在某几个元素之和等于总和的一半。注:若总和为奇数则可以直接返
二分法的两个例子 问题一:转变数组后最接近目标值的数组和(leetcode1300)问题描述:给你一个整数数组arr 和一个目标值target ,请你返回一个整数value,使得将数组中所有大于value 的值变成value 后,数组的和最接近target(最接近表示两者之差的绝对值最小)。如果有多种使得和最接近target的方案,请你返回这些整数中的最小值。请注意,答案不一定是arr 中的数字。示例 1:输入:arr = [4,9,3], target = 10输出:3解...
股票交易问题全拿下,一扫光 上来直接最难的,后面都是毛毛雨。问题一:买卖股票的最佳时机IV(leetcode188)问题描述:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv著作权归领.
并查集及其应用 并查集介绍并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集的初始化方法为先让所有的结点自成一个独立的集合,自己作为自己的簇头(是用簇头来标识集合的);若已知两个元素属于同一集合,则将这两个元素所在的集合合并。并操作:将两个元素所在的集合合并查操作:找到给定元素的簇头如下图所示就是unio(a , b)的过程,此外在为了提高并查集的查询效率,一种很容易想到的做法为让并查集尽可能的矮,因此在查询的过程中,将查到的中间结点的都连到其簇头下面。案例一:等式.
数组中第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输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-largest-.
前缀树及其应用 前缀树又称为字典树,单词查找树。其最大的优点为利用字符串的公共前缀极大的提高字符串的查询效率。如下图所示为“apple”,“app”,“apply” “pen”组成的前缀树结构问题一:leetcod208实现前缀树问题描述:实现一个 Trie (前缀树),包含insert,search, 和startsWith这三个操作。示例:Trie trie = new Trie();trie.insert("apple");trie.search("apple"); // ...
拓扑排序及其应用 AOV网的概念:AOV网是有向无环图的一种,全称Activity OnVertex Network,顾名思义活动在顶点的网,使用顶点表示活动,顶点之间的边表示活动的先后顺序,例如<a,b>有一条从a到b的边,表示a活动发生在b之前。拓扑排序:在AOV网没有环路的情况下,将这些活动排成一个满足所有边的先后顺序条件线性序列。排序算法:1)选择AOV网中一个没有前驱的结点输出;2)将输出结点从图中删除(并删除与当前结点相连的所有边)3)重复1)2)直到图中没有结点。..
打家劫舍 问题描述:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。...
单词拆分 问题描述:给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定s 是否可以被空格拆分为一个或多个在字典中出现的单词。拆分时可以重复使用字典中的单词。 可以假设字典中没有重复的单词。示例 1:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。来源:力扣(LeetCode)链接:https://lee...
子数组和的最大值最小问题 顾名思义,将一个数组分为k个子数组,求解怎么分才可以使得这些子数组中和最大的值最小。案例一:在D天内送达包裹的能力传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。传送带上的第 i个包裹的重量为weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5输出:15解释:船舶..
0/1背包与完全背包 背包问题描述:假设有一个固定容量的背包,然后有许多具有价值属性和重量属性的物品,要求在不超过背包最大容量的基础上装的物品的总价值最大。假设共有N个物品,背包的容量为M,物品 i 的价值与重量分别为 value[i] 和 weight[i]。dp[i][j] 为可选物品为一到i,背包空间为j时的最大价值。0/1背包0/1背包为最基础的背包问题,顾名思义,所有的物品只有一件,只有拿或不拿两种选择,dp[i][j]的表达式如下:最大价值为选i物品和不选i物品的最大值。实现代码如下:
子数组和问题II 本次的两个算法题是子数组的积的问题,勉强也能算做子数组和的问题。问题一:乘积小于k的子数组问题描述:给定一正整数数组以及一整数k,要求找到所有乘积小于k的子数组的个数。input : nums = [3 5 2 8] k = 17output: 7 解释: [3] [5] [2] [8] [3 5] [5 2] [2 8]解法一:前缀和 + 二分搜索看到题的第一反应还是用前缀和数组求解。但是由于是乘积可能会出现越界情况,因此对num求对数。此时的乘法就变为了加法。因...
子数组和问题 我们刷leetcod时总是遇到各种各样的子数组和的问题,这类问题一般都是可以通过构建一个前缀和数组,以O(N^2)的时间复杂度求解,但这并不是最优解。问题一:和为K的数组问题描述:给定一整型数组nums和一整数k,找到该数组中和为k的子数组的个数。input : nums = [1,2,3,-3,-2,-1,0] k = 0output: 5 分别为[3,-3], [2,3,-3,-2], [1,2,3,-3,-2,-1], [1,2,3,-3,-2,-1,0] , [0]...
只出现一次的数字问题 问题1给定一整形数组,已知该数组中一个数出现了一次,其余的数出现了偶数次,找到这个出现一次的数解法一:使用hashMap记录次数,然后返回只出现一次的那个数代码如下: public int singleNumber(int[] nums) { Map<Integer, Integer> map = new HashMap<>(); for(int num : nums) { int val = map.c
跳跃游戏 问题描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。..