![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
用于整理自己在练习算法题时自己的思路。
lippon
Think Different.
展开
-
算法——最小生成树的关键边和伪关键边
给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti] 表示在 fromi 和 toi 节点之间有一条带权无向边。最小生成树 (MST) 是给定图中边的一个子集,它连接了所有节点且没有环,而且这些边的权值和最小。请你找到给定图中最小生成树的所有关键边和伪关键边。如果从图中删去某条边,会导致最小生成树的权值和增加,那么我们就说它是一条关键边。伪关键边则是可能会出现在某些最小生成树中但不会出现在.原创 2021-01-25 15:47:57 · 1005 阅读 · 0 评论 -
算法——摩尔投票法问题
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。解题思路:题目要求我们求出现次数超过三分之一总数的元素,说明最多存在两个元素符合条件。始终持有两个元素,遍历列表,对他们进行一个记分数,如果遇到与持有元素相同的元素,则对该元素进行加分,不然对其减分。如果分值为0,那么就将持有元素替换为当前遍历元素。因为不一定能够产生答案,所以,对两个元素再进行重新记分,看看是否超过了三分之一。cl.原创 2021-01-18 14:47:49 · 178 阅读 · 0 评论 -
算法——将数组n等分(斯特林数)
给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间。请你将这些工作分配给 k 位工人。所有工作都应该分配给工人,且每项工作只能分配给一位工人。工人的 工作时间 是完成分配给他们的所有工作花费时间的总和。请你设计一套最佳的工作分配方案,使工人的 最大工作时间 得以 最小化 。返回分配方案中尽可能 最小 的 最大工作时间 。leetcode解题思路:暴力深搜每个情况,求出最小的值。在搜索每一层的时候,需要搜索的情况有:添加到每一个已有集合。新建一个集合。c.原创 2021-01-10 15:36:39 · 704 阅读 · 0 评论 -
算法——添加字符得到最短回文串
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。leetcode解题思路:首先找到最长的回文串;然后添加之前无法组成回文串的部分。class Solution { public String shortestPalindrome(String s) { String reverse = new StringBuffer(s).reverse().toString(); for(int i .原创 2021-01-12 17:18:51 · 716 阅读 · 1 评论 -
算法——课程表 II(有向图拓扑排序)
现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。leetcode解题思路:这是是个有向图的拓扑排序问题。如果图中存在环,那么就不能产生结果,需要返回空。利用一个map来保存图,需要先学习的课程为出发点;.原创 2021-01-09 20:40:53 · 234 阅读 · 1 评论 -
算法——数字范围按位与
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。leetcode解题思路:找规律的问题,在实战中,很难快速进行证明。就是可以发现,只有前缀的1才有可能保存下来,应为是连续的,后面是肯定会产生很多0的,所需,寻找最长的前缀1就是最后的位与答案。class Solution { public int rangeBitwiseAnd(int m, int n) { i.原创 2021-01-06 16:41:46 · 154 阅读 · 0 评论 -
算法——地下城游戏(倒推DP)
一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点.原创 2021-01-01 16:05:47 · 421 阅读 · 2 评论 -
算法——模拟小数除法
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。如果小数部分为循环小数,则将循环的部分括在括号内。如果存在多个答案,只需返回 任意一个 。对于所有给定的输入,保证 答案字符串的长度小于 104 。leetcode解题思路:这里需要解决的就是一个最后循环小数的问题。如果被除数反复出现,那么就肯定存在循环了,所以,我们只需要记录每个被除数以及它在小数计算中的起始位置,这样,在下一次遇到这个被除数时,就能通过前一个被除数的位置,得到循环.原创 2021-01-01 15:02:23 · 242 阅读 · 1 评论 -
算法——补齐数组使得数组可以组成一段区间内的所有元素
给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。leetcode解题思路:贪心思想,遍历数组,如果不存在当前的元素,那么就直接加入当前的元素,这样,当前元素的两倍减一的所有数都能被表示了。如果存在当前元素,那么就将数组下标增加,同时不可表示的数也增加当前的数组元素,数组下标增加。class Solu.原创 2020-12-29 14:56:16 · 177 阅读 · 0 评论 -
算法——交错字符串
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:s = s1 + s2 + … + snt = t1 + t2 + … + tm|n - m| <= 1交错 是 s1 + t1 + s2 + t2 + s3 + t3 + … 或者 t1 + s1 + t2 + s2 + t3 + s3 + …提示:a + b 意味着字符串 a 和 b 连接。le.原创 2020-12-24 17:04:59 · 272 阅读 · 2 评论 -
算法——分发糖果
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?leetcode解题思路:贪心做法,通过两次遍历,求每个位置的元素满足右规则和左规则的最小情况,然后取最大值。如果取一边情况下的最大值,会不会破坏另一边的规则呢?再遍历每一个方向上的时候,我们都是在保证后者需要大于前者的时候,.原创 2020-12-24 15:14:14 · 470 阅读 · 0 评论 -
算法——去除重复字符并使得字典序最小
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。leetcode解题思路:利用单调栈的思想,新添加的从末尾添加,弹出比它大的栈顶元素,这样就能保证有序,且字典序最大。不同的是,必须保证原有字母还存在一个,所以,如果栈顶元素是剩下的唯一的一个字母了,那就不能弹出它。所以,该栈不是严格意义的单调栈。class Solution { public String removeDuplicateLetters.原创 2020-12-20 14:36:16 · 3686 阅读 · 0 评论 -
算法——合并计算区间问题
一维的区间合并计算问题种类很多,但是都是一个套路,起点排序,在这里做一个汇总。合并无序区间给出一个区间的集合,请合并所有重叠的区间。leetcode解题思路:先根据起点进行排序,再遍历数组,然后用一个指针获取当前区间:如果遇到交集,就合并区间,将指针指向合并过的区间;如果没有交集,那么就将指针所指的区间添加到答案末尾,再将指针指向后面的区间。class Solution { public int[][] merge(int[][] intervals) { Li原创 2020-12-19 14:49:56 · 352 阅读 · 1 评论 -
算法——跳跃游戏问题
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。leetcodeDP解题思路:利用一个数组,表示到达每个位置最少跳跃次数。遍历数组,然后对每个位置可以跳到的范围内的位置进行状态转移,保留次数少的。时间复杂度是n方的。class Solution { public int jump(int[] nums) { int n = nums.length; .原创 2020-12-18 16:37:59 · 719 阅读 · 1 评论 -
算法——两数快速相除求整数部分
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335)= -2leetcode解题思路:因为这里只需要求整数部分,首先能够想到的是拿除数去循环减被除数,能减多少个还是非负数,答案就是多少,这样的效率很低,如果被除数特别大,除数.原创 2020-12-16 17:03:48 · 1826 阅读 · 0 评论 -
算法——石子游戏(区间DP,记忆化dfs,博弈)
简介石子游戏其实就是多人博弈,如何求最优结果。它存在很多变种,比如不同的取石方式,不同的计算输赢的方式,在这里做一个汇总。只能从两端取石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 。有 n 块石子排成一排。每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的石头,并获得与该行中剩余石头值之 和 相等的得分。当没有石头可移除时,得分较高者获胜。鲍勃发现他总是输掉游戏(可怜的鲍勃,他总是输),所以他决定尽力 减小得分的差值 。爱丽丝的目标是最大限度地 扩大得分的差值 。给你一个整原创 2020-12-13 14:54:42 · 1708 阅读 · 1 评论 -
算法——判断范围内的质数数量
统计所有小于非负整数 n 的质数的数量。leetcode解题思路:首先想到的是暴力枚举,但是会超时。采用埃氏筛选发,所谓素数,就是由质数的积够成的,所以,当得到一个素数,就可以标记后面所有由它的乘积而形成的素数。利用一个表标记当前数的类型。首先从低到高枚举所有数,然后如果是素数答案就加一,并标记于其关联的所有素数。class Solution { public int countPrimes(int n) { boolean[] f = new boolean[.原创 2020-12-03 15:12:51 · 820 阅读 · 0 评论 -
算法——重构字符串使得相邻字符不同
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。若可行,输出任意可行的结果。若不可行,返回空字符串。leetcode解题思路:首先想想什么样的情况下不能构成可行的字符串,就像植树问题,最大的相同的字符个数一定小于字符串长度加一再除以二,如果超了就肯定会相邻。所以,我们在枚举输出的时候,只要剩下需要输出的字符串一直满足这个条件,就一直能够产生合法的答案。当我们每次输出数量最大的两个字符串的时候,就能够让原来的字符串一直满足条件了。你想嘛,如果输出数量少了,那么数量大的不就.原创 2020-11-30 15:48:31 · 3896 阅读 · 0 评论 -
算法——利用数组内所有元素进行加或者减以达到目标和
给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。leetcode解题思路:首先想到的是暴力深搜,枚举每一种做法,这样时间复杂度是n方的,也没有什么意义。可以采用动态规划的思想。设负数和为y,正数和为x,则有 x + y = S,还有x - y = sum,sum是数组中所有元素的累加。这样可以得到 x = (S.原创 2020-11-28 15:50:59 · 1122 阅读 · 0 评论 -
算法——求矩阵中和最大的子矩阵
给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。leetcode解题思路:首先为了在O(1)的时间内获取两个点之间的矩阵和,就需要求每个点的前缀和,然后通过前缀和的是运算,快速获取两个点构成的矩阵的和。然后是遍历整个数组,但是如果依次枚举每两个点的话,时间复杂度是n.原创 2020-11-27 19:17:08 · 2130 阅读 · 0 评论 -
算法——二维数组中寻找边界最长的正方形边框(不包括内部)
给定一个方阵,其中每个单元(像素)非黑即白。设计一个算法,找出 4 条边皆为黑色像素的最大子方阵。返回一个数组 [r, c, size] ,其中 r, c 分别代表子方阵左上角的行号和列号,size 是子方阵的边长。若有多个满足条件的子方阵,返回 r 最小的,若 r 相同,返回 c 最小的子方阵。若无满足条件的子方阵,返回空数组。leetcode解题思路:这道题和之前遇到的寻找最大正方形很类似,不同的是,这里只需要一个边框就行了,所以更加麻烦一些。首先通过DP计算以每个元素为起点,向下的和向右.原创 2020-11-27 16:49:52 · 513 阅读 · 0 评论 -
算法——乱序数组排序后的元素最大间距值
给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。如果数组元素个数小于 2,则返回 0。leetcode解题思路:如果进行排序,这里会超时。采用桶排序的思想,可以在线性时间解决。首先建立桶,每个桶中只需要存放这个桶中元素的最大值和最小值。桶尺寸就是数组中元素范围再除以数组的大小,桶的数量就是数组范围除以桶的尺寸再加一。为什么需要这样规定桶的尺寸呢?因为这样可以让最大的间距的两个元素在两个不同的桶中。可以证明一下,因为我们用元素范围之差除以元素个数,所以桶的尺寸就是平均的元素间.原创 2020-11-26 19:46:26 · 414 阅读 · 0 评论 -
算法——字符串搜索字典中匹配单词的所有位置
给定一个较长字符串big和一个包含较短字符串的数组smalls,设计一个方法,根据smalls中的每一个较短字符串,对big进行搜索。输出smalls中的字符串在big里出现的所有位置positions,其中positions[i]为smalls[i]出现的所有位置。leetcode字典树解题思路:先将用字典构造字典树。然后依次截取所有下标开始的字符换,进行搜索。搜索的时候,就检测当前节点是否为一个单词的结尾,如果是,就向答案中对应的单词列表添加当前的下标。最后将列表转化为数组。cl.原创 2020-11-25 16:50:44 · 621 阅读 · 0 评论 -
算法——丢鸡蛋问题
你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。你的目标是确切地知道 F 的值是多少。无论 F 的初始值如何,你确定 F 的值的最小移动次数.原创 2020-11-24 20:49:05 · 495 阅读 · 0 评论 -
算法——乘积最大的连续子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。添加链接描述解题思路:再计算过程中,会产生负数和正数,需要同时保存最小的负数和最大的整数,因为乘起来的时候都有可能是产生更大的结果。利用两个变量,一个存储最大值,一个存储最小值,每次遍历的都是都更新这个两个值,然后比较答案。class Solution { public int maxProduct(int[] nums) { int res .原创 2020-11-24 16:13:00 · 959 阅读 · 0 评论 -
算法——完全二叉树求节点个数
给出一个完全二叉树,求出该树的节点个数。说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。leetcode解题思路:如果是暴力做法,就只需要对树进行一次遍历就好,时间复杂度是O(N)的,但是这就没有利用到这里的要求,也就是完全二叉树。根据完全二叉树的性质可知,总节点个数就是2的其层数次方 - 1。这样,我们就可以递归各个层,每次获取完整.原创 2020-11-24 13:59:57 · 1795 阅读 · 0 评论 -
算法——统计不同节点数量下搜索二叉树的情况数量
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?解题思路:利用动态规划的思想。从小到大遍历每个节点数量的情况。首先是状态标识,利用里一个数组,标识不同节点数量下的情况。然后是状态转移,在从头遍历到结尾,枚举每一个中间节点为根时的组合数量,再累加就是当前节点数量下的种类数量。以当前节点为根的组合情况,自然时左树的数量与右树的数量之积。class Solution { public int numTrees(int n) { if(n == 0) r.原创 2020-11-23 17:10:09 · 189 阅读 · 0 评论 -
算法——二叉树转链表转换问题
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。leetcode迭代解题思路:通过栈来中序遍历这个二叉搜索树。遍历的时候,第一次遍历到底部的时候,那个节点就是头节点。每次遍历的时候都要存下当前节点为前节点。在之后的遍历中,用前节点的right指向下一个节点节点。在用当前节点left指向前一个节点。如果这里的right和left发生对换也可以,不过迭代之后的顺序就要发生改变,因为我们每次都是去判断其右子树是否存在,如果前面.原创 2020-11-23 15:46:39 · 189 阅读 · 0 评论 -
算法——柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。leetcode解题思路:首先想暴力该怎么做?就是依次遍历数组,当遍历到一个元素的时候,在去找到它的左右两边第一个比它小的柱子的位置,这样就能取最大值。暴力的方法是N方的。降低时间复杂度的方法。因为每次需要去遍历每个元素左右两边第一个比它小的位置,就很费时间。所以,可以先通过两次遍历,分别求每个元素在左右两个方向上,第一个比他小的元素的索引值,这样,就不需要.原创 2020-11-22 22:01:02 · 93 阅读 · 0 评论 -
算法——字符串增删改匹配问题
class Solution {class Solution { public int minDistance(String word1, String word2) { int n = word1.length(), m = word2.length(); int[][] f = new int[n + 1][m + 1]; for(int i = 0; i < n + 1; i++) f[i][0] = i; for(in原创 2020-11-22 17:02:33 · 1003 阅读 · 1 评论 -
算法——马戏团人塔
有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上。出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一点。已知马戏团每个人的身高和体重,请编写代码计算叠罗汉最多能叠几个人。leetcodeDP + 二分解题思路:首先将根据将数组根据身高正序排列,然后根据体重逆序排列。这样,就将问题转化为求体重的最长上升序列的问题了。时间复杂度是NlogN 的。为什么身高相同体重需要逆序排列呢?当遍历数组的时候,我们当然希望后面的升高越小越好,如果相同的体重,就会出现覆盖的问题,可以让小的覆.原创 2020-11-21 20:01:14 · 175 阅读 · 0 评论 -
算法——婴儿名字
每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来。给定两个列表,一个是名字及对应的频率,另一个是本质相同的名字对。设计一个算法打印出每个真实名字的实际频率。注意,如果 John 和 Jon 是相同的,并且 Jon 和 Johnny 相同,则 John 与 Johnny 也相同,即它们有传递和对称性。在结果列表中,选择字典序最小的名字作为真实名字。添加链接描述解题思路:首.原创 2020-11-21 16:41:34 · 222 阅读 · 0 评论 -
算法——括号问题及其衍生
求最长合法括号序列问题给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。leetcode解题思路:利用一个前缀和的思想,顺序遍历,遇到左括号和加一;遇到右括号,和减一。当和为0的时候,就是一个合法序列。如果和为负数,那么以当前起点产生的序列不再可能产生合法的序列,因此,将起点设置到当前点的下一个位置,并将和置零重新累加。需要注意的是,如果只从一个方向遍历,会漏掉有效括号在在中间的情况,因此,在逆序遍历一遍就好了,同时,条件也要相反。class Solutio原创 2020-11-20 20:15:11 · 295 阅读 · 0 评论 -
算法——合并多个有序链表
给你一个链表数组,每个链表都已经按升序排列。你将所有链表合并到一个升序链表中,返回合并后的链表。leetcode解题思路:利用一个优先队列,对有序链表的头节点进行维护,每次取出一个队列头,就能取到节点中的最小值,然后添加到新建的链表尾部,然后如果这个节点有next,就把他的next再放进优先队列中。直到队列取完。class Solution { public ListNode mergeKLists(ListNode[] lists) { ListNode dummy =.原创 2020-11-19 21:01:17 · 354 阅读 · 0 评论 -
算法——模拟四则运算
给定一个包含正整数、加(+)、减(-)、乘( * )、除(/)的算数表达式(括号除外),计算其结果。表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。leetcode解题思路:模拟CPU进行运算的方式,利用栈的思想。遍历字符串,如果遇到符号,则读取下一个数字,然后判断符号。如果是乘除,那么直接拿这个数字和栈顶元素运算。如果是减号,则将当前元素变为负数。如果是加号,则不操作。运算完成符号之后,再将处理过的数值放到栈顶。最后完成遍历,将栈中的元素都.原创 2020-11-19 14:17:47 · 654 阅读 · 0 评论 -
算法——模拟LRU机制
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最.原创 2020-11-18 21:22:53 · 247 阅读 · 0 评论 -
算法——加油站
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。leetcode解题思路:依次遍历出发点,然后出发,如果当前油量小于0,则从这次出发点到当前点都不可能是答案,则选下一个点为出发点。如果之前走过的会产生油量小于零的部分都会有解,那么后面的就一定也有解,由于.原创 2020-11-18 19:30:15 · 413 阅读 · 0 评论 -
算法——最长公共子序列(动态规划)
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。leetcode解题思路:常规的动态规划问题。首先是状态表示,用一个.原创 2020-11-16 20:08:30 · 226 阅读 · 1 评论 -
算法(图论)——最短路径问题(弗洛伊德算法)
给定一个带权有向图,计算任意两结点间的最短路径。算法思想:遍历每个点到另外点的距离。三层循环,第一层枚举中间点,第二层和第三层枚举起点和终点。int N = 1010, M = 2000010, INF = 1000000000;int n, m;int d[N][N]; // 存储两点之间的最短距离int main() { cin >> m >> n; Scanner sc = new Scanner(Sytem.in); int n.原创 2020-11-16 19:17:32 · 200 阅读 · 0 评论 -
算法(图论)——最小生成树及其题目应用(prim和Kruskal算法实现)
题目n个村庄间架设通信线路,每个村庄间的距离不同,如何架设最节省开销?Kruskal算法特点适用于稀疏图,时间复杂度 是nlogn的。核心思想从小到大选取不会产生环的边。代码实现代码中需要采用并查集的方法检测是否有环。class Edge { int a, b, val; public Edge(int a, int b, int val) { this.a = a; this.b = b; this.val = val; }}int[] father;原创 2020-11-16 16:44:11 · 206 阅读 · 0 评论