- 博客(71)
- 收藏
- 关注
原创 LeetCode-二叉树染色 动态规划+深度优先搜索
题目描述:LeetCode-二叉树染色本题使用动态规划+深度优先搜索解法首先需要有一个大致的解题方向:本题是针对二叉树的最优化(求最大值最小值问题),对于最优化问题,一般想到采用动态规划解法。但是有了大致方向,具体的步骤——设计状态转移方程以及方程的初始值的确定依然是难点。这记录一下我参考学习 官网的题解后的解法对于二叉树中的每个节点,都有染色或不染色两种选择。对于每个节点node我们构建一维动规表dp[k+1],表长度为k+1,其中dp[0]存储不染色情况下以节点node为根的子树的最大价值;当i&
2021-07-30 14:20:24
944
原创 Linux安装MATLAB
MATLAB是在我们进行数据处理、数学运算时常用到的软件。而处理一些较大规模数据时,使用一般个人电脑上的MATLAB速度会比较慢,而使用服务器速度会提高很多。大多数服务器的操作系统都是Linux,因此就需要知道如何在Linux系统上安装MATLAB主要参考博文:https://blog.csdn.net/wangxiaai/article/details/100024185)操作系统:Ubuntu 16.04.1(这是我的系统版本,其他的Linux版本应该也可以)MATLAB版本:MATLAB 201
2020-11-12 15:51:07
1476
原创 秋日的随想——LeetCode-LCP 19.秋叶收藏集 多重线性动态规划
天高云淡,秋高气爽,又是一个金秋。秋天是收获的时节,作者在今年的夏秋之际以一名计算机专业应届生的身份参加了秋招。当中经历了许多挫折和挑战,也收获了许多知识和感悟;对自己的当下有了更加深刻的认识,对未来的生活也有了一些计划。当然最重要的,收获了一份比较满意的互联网公司软件研发岗位的Offer,嘻嘻,要挣钱了。秋风吹起,金色的落叶簌簌飘扬而下,反射着金色的阳光,真是金色的好时光啊。让我想起了两年前,也是这样的一个金色日子,那天是周末,我走在校园里,准备去做做LeetCode的代码题,一眨眼啊,时光就飞奔向.
2020-11-10 10:22:44
263
原创 LeetCode-97.交错字符串 动态规划
这里是题目描述:LeetCode-97.交错字符串本题使用 动态规划 解法。设给定的三个字符串s1,s2,s3的长度分别为l1,l2,l3,首先确定l1+l2==l3,若不相等,则s3肯定不能通过s1和s2交错组成,直接返回false若l1+l2==l3,建立并维护一个二维动规表dp,长宽尺寸分别为l1+1、l2+1。dp[j][k]记录s1从开头到下标j-1的子串和s2从开头到下标k-1的子串能否交错组成s3从开头到下标i+j-1的子串。dp表的j=0和k=0即首行首列处记录s1和s2子串为空的情况
2020-07-18 13:48:55
264
原创 程序员面试金典-17.25.单词矩阵 回溯法+字典树
这里是题目描述:17.25.单词矩阵本题在LeetCode官网上的难度等级为hard。首先将words中的单词按长度来整理;然后使用基于 回溯 的解法,按单词长度来穷举可能的单词矩阵,判断并更新最大面积矩阵,在穷举的过程中注意“剪枝”(具体剪枝策略详见代码);此外,把words中的所有单词存入 字典树 当中,用于检查每个可能的矩阵是合法,即矩阵的纵列是否也是word中的单词,如果矩阵某个纵列中出现了不是words中单词的字母序列提前剪枝,如果矩阵所有纵列中的单词序列都是word中的字母序列,判断是否
2020-07-03 15:47:14
249
原创 LeetCode-41.缺失的第一个正数 原地哈希
这里是题目描述:LeetCode-41.缺失的第一个正数本题的难度标注为hard。本题的难点在于解法需要同时满足 O(n) 的时间复杂度和常数级别的空间复杂度。首先假设我们不去考虑空间复杂度的要求,那么如何在 O(n) 的时间开销下解决本题?对了,就是哈希表,像这种考察数组中数字是否存在、数字是否重复、数字重复次数的题,都可以考虑借助哈希表这种数据结构解题借助哈希表的解法(不满足空间限制)首先要知道一个前提,假设给定的数组nums的长度为n,那么数组缺失的第一个正数就一定在1~n+1这个范围内。我们
2020-06-28 15:18:06
168
原创 LeetCode-1488.避免洪水泛滥
这里是题目描述:LeetCode-1488.避免洪水泛滥思路详解:定义如下三个数据结构:a. Map<Integer, LinkedList<Integer>>,存储每个湖对应的下雨日期列表,例如 1842=><1,21,31>; 1843=><2,22,32>b. PriorityQueue<Lake>,这是一个小堆,存储的是湖泊的下一个雨天,谁最近就会排在最上面c. Set<Integer> fullLack
2020-06-23 11:10:19
670
原创 LeetCode-999.由斜杠划分区域 dfs和并查集两种方法
这里是题目描述:LeetCode-999.由斜杠划分区域方法1:dfs方法本解法参考LeetCode官网题解【图解算法】三种详细解法!中的方法1大体步骤是:将NxN网格中的每个1x1方块划分成3x3的更小的方格,整个网格就被划分成了(3N)x(3N)个更小的方格。然后将各个对角线斜杠上填充1来代表斜杠,其余部分全部填充为0。这样,问题就转化成了求整个(3N)x(3N)网格中有几个0连通块,可以用dfs来求得连通块个数更详细的描述见上面的参考题解链接题解dfs方法题解代码:public class
2020-06-23 10:44:47
163
原创 LeetCode-1483.树节点的第 K 个祖先 倍增动规、层序遍历+前序遍历+二分查找
这里是题目描述:LeetCode-1483.树节点的第 K 个祖先本题有两种解法,分别是 使用倍增的动态规划 和 层序遍历+前序遍历+二分查找,这两种方法各有特点,下面我们对这两种解法进行介绍方法1 倍增动态规划本解法参考了LeetCode官网的题解:题解一题解二如果使用动态规划来解本题,按照常规想法应该建立并维护的动规表dp是什么样呢?常规想法dp[i][j]存储的是编号为i的节点的第j个祖先。但是从题干中可知,节点总数n和第k个祖先的取值范围是1<= k<=n<= 5*10
2020-06-17 14:55:00
276
原创 二分查找——LeetCode-1300.转变数组后最接近目标值的数组和、LeetCode-5438.制作 m 束花所需的最少天数
LeetCode-1300.转变数组后最接近目标值的数组和这里是题目描述:LeetCode-1300.转变数组后最接近目标值的数组和我们可以确定,最后要返回的结果整数value的所在的范围是[0,m],其中m是所给的数组arr中的最大数字。如果用暴力法,我们需要对从0到m的所有数字进行尝试,每次尝试都要遍历一遍arr,计算用当前的数字替换arr中所有大于它的数字后arr所有元素的和;最后选择元素和与target相差最小的数字。设数组的长度为n,则时间复杂度为O(nm)接下来使用二分法进行优化。在结果整
2020-06-15 15:26:58
177
原创 LeetCode-面试题17.08.马戏团人塔 排序+非常规线性动规+二分查找
这里是题目描述:LeetCode-面试题17.08.马戏团人塔本题求的是需要同时满足上面的人要比下面的人矮一点且轻一点,也是就是身高和体重同时满足严格递增关系的最长排列子集的长度。面对身高和体重两个限制条件,我们可以先着手解决其中一个限制条件——将演员按身高升序排序;那么如何解决另一个限制条件体重呢?我们再按身高升序排序的基础上,再按体重降序排序。也就是:对所有演员进行排序,首先按身高升序排序,对于身高相同的演员,再按体重降序排序,这样排序过后,就将问题转化成了问题LeetCode-300.最长上升子序列
2020-06-08 15:54:15
271
原创 并查集——LeetCode-990.等式方程的可满足性
这里是题目描述:LeetCode-990.等式方程的可满足性本题使用并查集来解,难度并不大,大体方法是:首先遍历题目给出的字符串数组equations建立并查集,如果遍历到的字符串包含"==",则对"=="两边的字符建立并查集,如果两个字符均没有包含在一个集合中,则新建立一个集合包含它们;如果两个字符只有一个包含在某个集合中或两个字符分别在不同的集合中,则将它们合并入一个集合中;如果两个字符位于同一个集合中,则不用进行任何操作 。位于同一个集合中的元素意味着它们被赋了相等的值,它们两两之间"=="成立。建
2020-06-08 14:42:02
174
原创 LeetCode-128.最长连续序列 哈希表法
这里是题目描述:LeetCOde-最长连续序列如果题干中不对时间复杂度做 O(n) 的限制的话,这道题没有什么难度,我们可以对数组排序后使用双指针(或者基于贪心算法)来解本题,时间复杂度为O(nlogn)。但是加上时间复杂度不超过 O(n) 这一限制后,我们不能再采用先排序再贪心的方法,因为大多数排序算法的时间复杂度都为O(nlogn),计数排序理论上的时间复杂度为O(n),但是这有限制条件——被排序的数组必须足够“紧凑”,如果被排序数组过于“稀疏”时间复杂度便不再是O(n)我们借助哈希表来实现 O(n
2020-06-06 14:35:38
204
原创 LeetCode-698.划分为k个相等的子集、416.分割等和子集 回溯法
这里是两道题的题目描述:LeetCode-698.划分为k个相等的子集LeetCode-416.分割等和子集LeetCode-698.划分为k个相等的子集题解代码:class Solution { public boolean canPartitionKSubsets(int[] nums, int k) { int sum=0; int maxValue=0; for(int i=0;i<nums.length;i++)
2020-06-05 15:19:58
312
原创 LeetCode-837.新21点 动态规划
这里是题目描述:LeetCode-837.新21点本题我们使用动态规划来解决维护一个长度为一维表dp,dp[i]存储累计点数为i这种情况的概率。一般的,状态转移方程为:dp[i]=dp[i-1]*(1/M)+dp[i-2]*(1/M)+...+dp[j-W]*(1/w),解释:每次抽取的数字在1~M之间,累计点数为i这个情况是由若干次独立的抽取数字累计得到的,因此累计点数为i可以被看做——由累计点数为i-1时又抽取了数字1、累计点数为i-2时又抽取了数字2、…累计点数为i-M时又抽取了数字M这些情况得到
2020-06-04 16:34:37
175
原创 设计实现哈希链表 LeetCode-146.LRU缓存机制
这里是题目描述:LeetCode-146.LRU缓存机制用哈希链表实现LRU缓存机制可以满足在 O(1) 的时间开销下完成获取数据get和写入数据put。因此我们设计实验哈希链表来实现缓存机制:题解代码:class LRUCache{ public Node head; //Node链表的头尾节点 public Node end; private HashMap<Integer,Node> hashMap; //存储LRU缓存内容键值对的HashMap,用于快速根
2020-05-29 17:25:26
193
原创 LeetCode-4.寻找两个正序数组的中位数
这里是题目描述:LeetCode-4.寻找两个正序数组的中位数本题参考了LeetCode官网题解暂时不对题解进行详述题解代码:class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { if((nums1.length+nums2.length)%2==1) //两数组总长度为奇数 { int k=(nums1.length+nums
2020-05-29 17:13:12
149
原创 马拉车算法 LeetCode-5.最长回文子串、LeetCode-214.最短回文串
马拉车算法马拉车算法是一种寻找给定字符串中的最长回文子串的方法,时间复杂度为 O(n) 。它除了可以解决“最长回文子串”的问题,还能解决由此变形的一些衍生问题,如“最短回文串”这里是马拉车算法的详述:一文让你彻底明白马拉车算法最长回文子串这里是题目描述:LeetCode-5.最长回文子串O(n)时间复杂度马拉车算法:马拉车算法解决的就是这个问题,因此不再做详述马拉车算法题解代码:O(n2)时间复杂度动规方法:本题可以还用动态规划的方法来解:维护一个二维表dp,dp[i][j]存储给定字
2020-05-29 16:39:31
327
原创 LeetCode-1371.每个元音包含偶数次的最长子字符串
这里是题目描述:LeetCode-1371.每个元音包含偶数次的最长子字符串本题考查到的知识点:前缀和、状态压缩、位运算(异或)。参考了LeetCode官网的题解暂时不对题解进行详述题解代码:class Solution { public int findTheLongestSubstring(String s) { int[] stateIndex=new int[(int)Math.pow(2,5)]; //记录32种状态的第一次出现的下标 for(int
2020-05-29 14:53:28
212
原创 LeetCode-907.子数组的最小值之和
这里是题目描述:LeetCode-907.子数组的最小值之和本题给定一个整数数组A,求A的所有(连续)子数组的最小值的和,直观上可以用暴力法:列出A的所有子数组,分别求出这些子数组的最小值,再分别将这些最小值相加。但是通过分析时间复杂度:列举出所有子数组需要 O(n2) 的时间复杂度,求一个子数组的最小值需要 O(n) 时间复杂度,因此整体需要 O(n3) 的时间复杂度,会超出时间限制,提交无法通过。我们需要时间效率更优的解法本题可以转化为:求A中的每个数字是A的几个子数组的最小值,只要知道了它是几个子
2020-05-28 19:17:51
662
原创 LeetCode-394.字符串解码 栈解决嵌套结构问题
这里是题目描述:LeetCode-394.字符串解码本题的难点在于:一个数字[字符串]组合的括号内,还可能嵌套着一个或多个数字[字符串]组合,如何正确的解码这种嵌套结构是本题的难点。我们使用 “栈” 这种数据结构来解决此类嵌套括号结构问题。注意这里说的是“此类问题”,因为许多拥嵌套括号结构的问题都可以使用栈来解决。后续会对这一类问题进行补充整理我们从左向右遍历题目给出的字符串(待解码内容),并维护一个栈,用来先进先出地存储遍历到的待解码的内容。如果遍历到数字、左括号[、字母则将它们存入栈中;如果遍历到
2020-05-28 17:36:50
200
原创 LeetCode-(夜喵双周赛20200517 第四题)5399.数位成本和为目标值的最大数字 背包动态规划
这里是题目描述:LeetCode-5399.数位成本和为目标值的最大数字本题使用背包动态规划来解。维护一个一维表dp,dp[i]用来存储
2020-05-17 21:35:17
149
原创 LeetCode-974.和可被 K 整除的子数组 哈希表、同余定理
这里是题目描述:LeetCode-974.和可被 K 整除的子数组首先解决子数组元素和问题,假设有数组sum,sum[i]记录从开头到第i个元素的累加和,则sum[j]-sum[i-1]表示从第i个元素到第j个元素(j>=i)的子数组的元素和接下来介绍同余定理:对于两个数a、b,如果有a%k==b%k,则(a-b)%k==0。因此如果有sum[i]%k==sum[j]%k,则(sum[j]-sum[i])%k==0。由此,我们可以 维护一个哈希表,哈希表的键是sum[i]对k的余数,对应的值是等于
2020-05-17 18:30:45
310
原创 二分查找灵活应用 —— LeetCode-287.寻找重复数、LeetCode-378.有序矩阵中第K小的元素
二分查找描述二分查找是一种在排序的线性表中常用的查找特定值的查找方式。它的常规过程是这样的:对于一个长度为n的线性表nums,我们在要寻找的目标值target的可能所在的区域nums[left,right]中对它进行寻找;最开始时,整个nums都是可能区域,因此初始化left=0,right=n-1分别指向线性表nums的最左端的下标和最右端的下标;根据left和right计算得到mid=(left+right)/2,即可能区域的中间位置的下标,若nums[mid]==target就找到了目标值,
2020-05-17 17:51:14
235
原创 LeetCode-310.最小高度树 基于广度优先搜索解决拓扑排序问题思路
这里是题目描述:LeetCode-310.最小高度树想要找到由给定的图构成的最小高度树的根节点,我们可以删除图中 “最外围” 的节点;删除操作后,又有一部分之前不处于 “最外围” 的节点成为新的“最外围节点”;因此不断重复执行 “删除最外围节点” 这一操作,直到只剩下位于原图 “最中心” 位置的节点,它们就是我们所寻找的最小高度树的根节点那么,如何循环地确定并删除最外围的节点呢?我们借助解决拓扑排序问题的思路...
2020-05-10 18:44:22
259
1
原创 LeetCode-16.最接近的三数之和 双指针法
这里是题目描述:LeetCode-16.最接近的三数之和本题的直观做法是:列举出所给的数组nums中所有的的三数组合,寻找出所有三数之和中与target最接近的。这种方法需要对数组nums进行三层遍历,时间复杂度 O(n3) 。接下来我们使用一种基于双指针的解法,时间复杂度被简化为 O(n2)双指针解法第一步,对数组nums进行升序排序。这里我们要引入一个经验之谈:对于许多题干中给出一个数组...
2020-05-04 16:26:29
133
原创 LeetCode-1424.对角线遍历II
这里是题目描述:LeetCode-1424.对角线遍历II本题的直观方法是确定每一条对角线的轨迹,再按顺序对每一条对角线上matrix中的元素进行输出。但是如下图所示,由于对角线轨迹中有许多没有元素的空缺位置,而使用直观方法依然要对这些空缺位置进行本不必要的遍历,最后会导致超出时间限制接下来我们介绍一种基于排序的方法,可以省去空缺位置的遍历基于排序的解法首先确定,matrix中的哪些元素...
2020-05-03 18:57:54
251
原创 LeetCode-1011.在D天内送达包裹的能力 贪心+二分查找
这里是题目描述:LeetCode-1011.在D天内送达包裹的能力首先我们来确定送包裹的船的运载能力的可能范围,即可能的最小值及最大值:即使不考虑送达包裹所需要的天数,船也必须能够运送所有包裹,所以 运载能力最小值是所有包裹的最大值,所有更小的运载能力都无法满足运送所有包裹;运载能力的最大值是所有包裹重量的总和,就能够满足一次运送完所有包裹,所有更大的运载能力都没有意义接下来在最大值和最小值之...
2020-04-29 16:57:12
252
1
原创 剑指Offer-面试题51.数组中的逆序对 基于归并排序
这里是题目描述:剑指Offer-面试题51.数组中的逆序对这道题的直观方法是将数组nums中的每个数和位于它后面的数字进行比较,若位于它后面的数字小于它,则逆序总数加1。这种方法的时间复杂度为O(n2),但我们根据题干可知,0 <= 数组长度 <= 50000,因此这种方法最多会带来超过10e10的运算,超出时间限制基于归并排序的方法统计逆序对我们使用一种在归并排序基础上的方法,...
2020-04-24 17:29:50
243
原创 LeetCode-1248.统计[优美子数组] 双指针法
这里是题目描述:LeetCode-1248.统计[优美子数组]双指针解法开辟一个数组或ArrayList<Integer>,将所给的nums中所有值为奇数的元素的下标存入其中。例如nums=[1,1,2,1,1],那么其中的奇数的下标就是[0,1,3,4];为了便于后面的计算,再在存储下标的数组中的开头和末尾分别插入-1和nums.length,如上面的例子变成[-1,0,1,3,...
2020-04-21 15:37:00
120
原创 LeetCode-11.盛最多水的容器双指针+贪心
这里是题目描述:LeetCode-11.盛最多水的容器双指针双指针+贪心解法一个容器的容量的计算方法是:组成容器的条垂直线中较短一条线的长度*两条垂直线的距离。那么如何确定组成容量最大的容器的两条垂直线。假设给定垂线数组height长度为n,我们使用两个指针left、right分别指向组成容器的两条垂直线,初始值left=0,right=n-1,即分别指向最左端和最右端;此时两垂直线间的距离最...
2020-04-18 16:57:39
154
原创 LeetCode-55.跳跃游戏 两种解法
这里是题目描述:LeetCode-55.跳跃游戏解法一(推荐):贪心算法使用一个变量记录farest从第一个位置开始能到达的最远位置下标;并遍历数组中从第一个到farest记录的能达到的最远位置,更新记录变量;直到能到达的位置大于等于最后一个元素,返回true,或遍历完毕变量也没能大于等于最后一个元素,返回false示例一:示例二:题解代码:class Solution { ...
2020-04-17 14:44:53
287
原创 剑指Offer-面试题56-II:数组中唯一只出现一次的数字 位运算
这里是题目描述:剑指Offer-面试题56-II:数组中唯一只出现一次的数字本题可以用哈希表统计数组中每个数字出现次数,时间复杂度O(n),空间复杂度O(n)。我们可以使用位运算的方法,将空间复杂度降至O(1)——统计数组中所有数字在二进制各个位上为1的次数总和:因为数组中出现次数不为1的数字都出现了3次,所以某一数字二进制上某一位为1的时候,这一位一定会出现3次为1。因此除去只出现一次的数字...
2020-04-14 19:45:42
175
原创 剑指Offer-面试题56-I:组中数字出现的次数 异或位运算
这里是题目描述:剑指Offer-面试题56-I:组中数字出现的次数对于这道题,我们很容易就能想到使用哈希表统计数组中每个不同数字出现次数的方法,但是它不满足题目要求的空间复杂度**O(1)**的限制。要满足常数空间开销,我们可以使用位运算中的 异或运算 。异或运算介绍在java中,异或位运算的操作符为^,如1与0异或运算,写作 1^0。异或运算则是对于两个操作数相互对应的每一位,如果两个操作...
2020-04-14 19:01:06
144
原创 剑指Offer-面试题59-II:队列的最大值 双端队列法
这里是题目描述:剑指Offer-面试题59-II:队列的最大值本题和与它同属于一个大题的剑指Offer-面试题59-I:滑动窗口的最大值都可以用双端队列来存储当前的最大值以及接下来可能成为最大值的元素,来优化时间开销借助双端队列的解法本题要求max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。而其中的主要难点就在于让任何状态下的max_value时间...
2020-04-14 17:40:53
184
原创 剑指Offer-面试题59-I:滑动窗口的最大值 双端队列法
这里是题目描述:剑指Offer-面试题59-I:滑动窗口的最大值这道题我们直观上可以使用蛮力法,对所有可能的滑动窗口,遍历它们并求最小值。假设数组长度为n,滑动窗口尺寸为k,那么蛮力法的时间复杂度将是O(nk)。对于长度很长,尺寸较大的滑动窗口来说,时间开销很大,不能满足要求。借助双端队列的解法我们观察滑动窗口的移动规律可以得知,滑动窗口每向右移动一步,原窗口最左边的数字出窗口,原窗口最右边...
2020-04-14 17:03:19
239
原创 LeetCode-887.鸡蛋掉落 动态规划+二分查找、非常规动态规划
这里是题目描述:LeetCode-887.鸡蛋掉落本题在LeetCode官网中被标记为hard,下面两种解法都是作者参考LeetCode官网中一个大神写的题解做出来的。我的总结较为简略,大神的题解较为详细,这里是LeetCode官网上大神的题解:鸡蛋掉落-题目理解 + 基本解法 + 进阶解法方法一:动态规划+二分查找建立有K+1行和N+1列的二维动规表dp,dp[i][j]存储有i颗鸡蛋和j...
2020-04-11 18:30:06
326
原创 LeetCode-739.每日温度
这里是题目描述:LeetCode-739.每日温度本题最直观的解法是两层循环遍历:外层循环遍历到某一天的气温T[i]时,内层循环从i+1开始向前遍历,直到有大于T[i]的气温,记录这一天和i的差值,就是超过第i天气温需要的天数;如果一直遍历到T末尾也没有比T[i]高的气温,则将需要天数记为0但是本题气温列表T的长度为[1,30000],也就是说问题的最大规模n为30000,上面所描述的直观方法...
2020-04-09 17:40:03
113
原创 剑指Offer-面试题49:丑数
这里是题目描述:剑指Offer-面试题49:丑数对于一个丑数,它能且只能被2、3、5整除,也就是说,丑数可以被除以2、3、5中的一个或几个数,最终得到0。对于本题,直观的方法是从i=1开始,判断每个数字能否被2、3、5整除最后得到1,如果可以,i就是丑数,找到的丑数个数+1,否则不是丑数,接着判断下一个数字i。这种方法固然没有错误,但是i不管是不是丑数,都需要经过计算判断,因此要寻找第n个丑数,...
2020-04-08 16:50:25
157
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人