- 博客(83)
- 收藏
- 关注
原创 Day67【一刷完结撒花】20250215图论part11_Floyd算法精讲|A*算法精讲(A star算法)|最短路径算法总结篇|图论总结
用三维的角度理解floyd算法。floyd算法的时间复杂度相对较高,适合稠密图且源点较多的情况。如果是稀疏图,floyd是从节点的角度去计算了,例如图中节点数量是1000,就一条边,floyd的时间复杂度依然是O(n^3),如果源点少,可以多次dijsktra求源点到终点,而不需要用floyd。挺难的,今天有点难进入状态,明天再看一遍四大最短路算法dijkstradijkstra朴素版dijkstra堆优化版Bellaman_ford队列优化算法(又名SPFA)
2025-02-15 15:57:33
1027
原创 Day66【快结束了,60天真不容易】_20250214_Bellman_ford队列优化算法(SPFA)|bellman_ford之判断负权回路|bellman ford之单调有限最短路
今天状态很好,能很顺利地跟着敲一遍代码。一个小细节(索引的开始位置) 为什么minDist数组从0开始,但是索引从1开始没有报错???在建立minDist数组的时候,索引从0开始,到n,有n+1个数。而建立邻接表的时候,由于输入数据本身没有0到某节点的数据,因此edge就没有0节点。minDist数组索引的时候,索引的是edge,因此没有0索引,不会报错。【有负权回路】多加了一个count[edge.to]每个节点的松弛次数,只要有一个节点的松弛次数==n,说明无限负数和循环,有负权回路。
2025-02-14 16:21:00
916
原创 Day65_20250213图论part9_dijkstra(堆优化版)|Bellman_ford算法精讲
与朴素版的代码,邻接表的表示方式不同。使用优先级队列(小顶栈)来堆新链接的边排序掌握关键点。
2025-02-13 15:00:06
470
原创 Day64_20250212_图论part8_拓扑排序|dijkstrs(朴素版)
思路简单,代码细节需要注意。除了最后一个地方不需要加空格,其他地方都需要要有一个过渡到result的队列queue,因为每次检查度为0的节点可能有很多个打印+终止条件一定要初始化,//起始点到自身的距离为0,必须加上,以便推理M公路,为了遍历M而得到边的权重(2点之间的路径)
2025-02-12 15:57:25
865
原创 Day63_20250211_图论part7 prim算法|kruskal算法精讲
为什么要用2个数组(grid数组和minDist数组)?grid数组: 存放所有节点的权值(区分生成树节点(有最小距离)和非生成树节点),中间数组,存放下一个被选中的生成树节点if(!minDist数组:1.存放最小生成树的最近距离(最小生成树所有边的权值), 最后保存距离 2.更新从当前节点cur到节点j的边权重(其他权重不更新)//非生成树节点&&更新从当前节点cur到节点j的边权重(其他权重不更新)if(!
2025-02-11 15:23:15
916
原创 Day62_补20250210_图论part6_108冗余连接|109.冗余连接II
有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图:现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图:先请你找出冗余边,删除后,使该图可以重新变成一棵树。输出示例思路思路题意转化为并查集当存在两个顶点处于同一个集合时,重复2次,说明有冗余边,删除最后一个。代码,初始化DisJoint,用join将两个顶点建立一个集合,然后用isSame判断两个不在1个集合中的顶点是否在一
2025-02-10 17:39:00
1055
原创 Day59_20250207_图论part4_110.字符串接龙|105.有向图的完全可达性|106.岛屿的周长
这题比较抽象。难避免惯性思维影响自己做题。
2025-02-09 21:31:17
816
原创 Day58_20250206_图论part3_101.孤岛的总面积|102.沉没孤岛|103.水流问题|104.建造最大岛屿
题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。现在你需要将所有孤岛“沉没”,即将孤岛中的所有陆地单元格(1)转变为水域单元格(0)。输入描述:第一行包含两个整数 N, M,表示矩阵的行数和列数。之后 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。输出描述输出将孤岛“沉没”之后的岛屿矩阵。
2025-02-09 16:46:33
818
原创 Day57_20250205_图论part3_99.岛屿数量深搜|99.岛屿数量广搜|100.岛屿的最大面积
注意有两个if判断条件相似,避免混淆扩展岛屿,只扩展到未访问的陆地//终止条件[未被访问过and遇到陆地] 扩展岛屿,只扩展到未访问的陆地,避免重复访问if(!只对新发现的岛屿进行dfs/如果发现新的岛屿[陆地没被访问过&&当前位置是陆地]if(!暂时掌握思路了,但是不能独立敲一遍代码,一刷先掌握思路。2种写法法1,只扩展到未访问的陆地,避免重复访问。法2,不管节点是否合法,先dfs,最后在终止条件的地方进行判断,不合法再return。写不出来bfs方法有点难。
2025-02-09 15:09:02
696
原创 Day56_20250204_图论part1_图论理论基础|深搜理论基础|98.所有可达路径|广搜理论基础
掌握邻接表和邻接图的代码写法挺复杂的,需要多练习几遍。
2025-02-07 22:31:30
640
原创 Day55_20250203_单调栈part2_42.接雨水|84.柱状图中最大的矩形
难题,难点在于怎么计算高度和宽度的代码思路。为什么要在首尾各扩展1个0【扩展数组】?保证栈中的每个元素最终都能计算出面积。例如递增数组[8,6,4,2],在8入栈后,6与8比较,得到mid(8),right(6),但得不到left。避免特殊情况。当栈非空时没有更多的柱子可以比较,加入0统一处理这个问题。
2025-02-07 14:45:18
813
原创 Day46补_代码随想录动态规划13|647.回文子串|516.最长回文子序列|动态规划总结篇
遍历初始条件i>=0;i–) 遍历len到1,即len-1到0j<len;j++) 遍历只考虑i <= j,遍历到len和647.回文子串相似,不同点在于该题是不连续的回文子序列。赶不上进度了,这一个总结篇很重要,等到将图论做完后,认真复习一下。
2025-02-07 10:27:16
1146
原创 Day48_20250130【回校继续打卡】_单调栈part1_739.每日温度|496.下一个更大元素I|503.下一个更大元素II
使用单调栈,当前遍历元素与栈顶元素相比较。[单调递增,比较遍历元素与栈顶元素],注意一点,当遍历元素>栈顶元素时,储存完res后,需要补充下一个元素用hash映射来确定在nums1中出现的位置在map中存放坐标和值在遍历中判断,if(map.containsKey(pre)),并保存位置res[map.get(pre)]=nums2[i];.containsKey 判断值是否相等.get 获取对应位置注意返回元素为return -1. Arrays.fill(res.-1);
2025-02-06 22:48:48
1249
原创 Day45_代码随想录20250124动态规划part12|115.不同的子序列|583.两个字符串的删除操作|72.编辑距离|编辑距离总结篇
思路,//用s[i-1]来匹配,个数是dp[i-1][j-1]//不用s[i-1]匹配,j没匹配上,找下一个i来匹配,个数是dp[i-1][j]记住此思路。
2025-01-27 10:58:44
897
原创 Day4320250123动态规划11|1143.最长公共子序列|1035.不相交的线|53.最大子序和|392.判断子序列
递归公式,如果相同+1,如果不同取两个text的最大值。为了处理边界条件,i和j从1开始,当i=0或j=0时,不存在任何数字可以连线。核心思路:当两序列的数不同时,删除t序列的不同的字母,最后比较两序列的最终长度是否相同。
2025-01-23 18:01:10
835
原创 Day43_20250122动态规划part10|300.最长递增子序列|674.最长连续递增序列|718.最长重复子数组
递推公式比较难想与非连续子序列的区别在于,if(nums[i]>nums[i-1]),与前一个数做比较。误区,return dp[i],应该返回遍历i中的最大dp[i],用三元运算符更节省内存。关键在于if(nums1[i-1]==nums2[j-1]){//相等。
2025-01-22 19:37:57
727
转载 [Redis] 两天速成基础学习笔记
key-value 存储系统,跨平台的非关系型数据库,数据结构服务器,内存数据库值(value)类型:字符串(String),哈希(Hash),列表(list),集合(sets),有序集合(sorted sets)应用:缓存、消息队列、会话存储。
2025-01-21 22:33:37
37
原创 Day42_20250121动态规划part9 188.买卖股票的最佳时机IV|309.最佳买卖股票时机含冷冻期|714.买卖股票的最佳时机含手续费
与123.买卖股票的最佳时机III的**【至多交易两次】**不同,该题目抽象化为至多交易k次。从123.题找规律奇数的初始化的其实条件1,终止条件i<2*k偶数的初始化的起始条件0,终止条件 2*k-1简化代码,//持有股票状态:上一天持有股票的状态,i-2天买入股票,有1天冷冻期在卖出的股票的时候减去-fee。
2025-01-21 11:34:30
1016
原创 Day41代码随想录20250120动态规划part08|121.买卖股票的最佳时机|122.买卖股票的最佳时机II|123.买卖股票的最佳时机III
分成两个数组,dp[i][0]和dp[i][1]分别表示持有股票和不持有股票最大金额。递推公式为,分为两个状态dp[i][0]和dp[i][1],买入或卖出股票,保持前一天的状态不变和上一题的区别在于,【可以买卖多次】 }上一轮不持有股票的状态+买入股票 dp[i-1][1]-prices[i],//买入股票(终点),保持原有状态这道题难在状态选择上,有5种状态,【至多有2次卖出】
2025-01-20 16:45:40
857
原创 Day39_20250119动态规划7 198.打家劫舍|213.打家劫舍II|337.打家劫舍III
记住套路,注意初始化的值,确定递推公式滚动数组法的逻辑?这题挺难的,需要复习。
2025-01-19 21:44:47
643
原创 Day38补20250117代码随想录动态规划6 322.零钱兑换|279.完全平方数|139.单词拆分|多重背包问题|总结
如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for循环遍历物品。低级错误,intn=amount.length;amount本来就是一个常数,犯错第二次了!!!!注意必须初始化为0,如果dp全为MAX,无法正确迭代必须加判断条件,当dp[j-coins[i]]为max,不进行迭代,否则会出错。反例:如果某个j面值无法通过硬币组合凑成,那么就是MAX_VALUE。
2025-01-17 21:16:39
758
转载 [MySQL] Day1 增删改查等一些基础操作
1.检查是否为NULL select * from runoob_tbl where runoob_title is not null;用到的时候再查文档:https://www.runoob.com/mysql/mysql-regexp.html。用于处理复杂度高的数据,一组SQL语句的执行,被视为单独的工作单元。添加PRIMARY KEY:ALTER TABLE users。2.使用COALESCE处理NULL,可以替换NULL的值。添加FOREIGN KEY:?OR进行多个匹配条件,加|
2025-01-16 20:57:08
35
原创 【Java回顾】Day7 Java IO|分类(传输方式,数据操作)|零拷贝和NIO
参考:https://javaguide.cn/java/io/io-model.html#nio-non-blocking-new-i-oNIO是IO多路复用模型线程首先发起调用,询问内核数据是否准备就绪。等准备就绪后,用户线程再发起read调用(数据从内核空间->用户空间)是阻塞的。select调用,支持一次查询多个系统调用的可用状态,几乎所有的操作系统都支持。epoll调用,linux 2.6内核,select调用的增强版本,优化IO执行效率NIO中的多路复用器selector。
2025-01-16 19:22:37
1037
原创 Day4补代码随想录 24.两两交换链表中的节点|19.删除链表的倒数第N个节点|面试题 02.07. 链表相交|142.环形链表II
用虚拟头节点,因为头节点也可能被要求删除。如果删除头节点,需要虚拟头节点。要删除的是“倒数第n个节点”,因此需要fastIndex作为基准。快慢指针保持一个相对距离。如果没有交点的时候,当p1为null,p2也为null代码才返回null吗,只有一个为null还是继续执行。因为交点之后的部分是相同的,两指针进入公共部分后会同步。这题的思路很巧妙。
2025-01-16 15:11:01
679
原创 Day37代码随想录动态规划5 |完全背包|518.零钱兑换II|377.组合总和IV|70.爬楼梯(进阶)
只能先遍历物品再遍历背包 例如{1,1,2}i++) { // 遍历物品j++) { // 遍历背包容量先遍历背包后遍历物品×,例如{1,2,1}j++) { // 遍历背包容量i++) { // 遍历物品如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for循环遍历物品。注意遍历背包容量起始为j=coins[i].j必须比coins[i]大于或等于,不然状态转移公式中的dp[j-coins[i]]是无效的。
2025-01-16 14:53:51
843
原创 Day36[追上进度啦]代码随想录_20250115 1049.最后一块石头的重量II|494.目标和|474.一和零
关键在于能想到转化为0-1背包问题,尽量把石头分为重量相似或相等的两堆,相撞后得到最小石头重量。返回值为return sum-2*dp[target];这道题的递推公式是归纳总结的规律。背包容量是二维的遍历数组中的每个字符串,并统计每个字符串的0和1个个数,找到二维背包容量m和n的target此题是求达到二维背包容量的最大组合数量,因此每选一个value+1。
2025-01-15 14:07:57
942
原创 Day35补代码随想录 01背包问题二维|01背包问题一维|416.分割等和子集
还需要再复习几遍这道题的难点是怎么将场景问题转换为背包问题细节 for(int j=target;j>=nums[i];j–) 注意遍历背包时,加了一个限制条件,j>=nums[i],如果数值已经大于target了,那就跳过。
2025-01-14 15:10:05
838
原创 Day34补代码随想录_20250113_62.不同路径|63.不同路径II|343.整数拆分(可跳过)|96.不同的二叉搜索树(可跳过)
注意,初始化dp[i][0]=1;和dp[0][j]=1;要分辨遍历完一遍i和j。三元运算符:condition?
2025-01-13 19:42:43
720
原创 Day32补代码随想录动态规划part1 理论基础 509.斐波那契数|70.爬楼梯|746.使用最小花费爬楼梯
这道题难度不大,主要是熟悉一下动态规划的5个步骤注意题目中,,因此如果n=1时属于特殊情况需要返回n。难点在于递归公式的推导,实质上和斐波那契数是一样的。注意int len=cost.length;//楼梯的总台阶数,没有包含楼梯顶部。
2025-01-13 13:55:39
665
原创 【Java回顾】Day6 JUC锁
AQS(AbstractQueuedSynchronizer) 队列同步器,以,构建锁或其他同步组件的基础框架,如ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch等。具体的同步逻辑需要由子类实现。,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套的机制,这个机制AQS是用。
2025-01-12 20:34:31
653
原创 【Java回顾】Day5 并发基础|并发关键字|JUC全局观|JUC原子类
参考:https://note.youdao.com/ynoteshare/index.html?参考:https://note.youdao.com/ynoteshare/index.html?
2025-01-12 20:29:43
745
原创 Day31补代码随想录20250110贪心算法5 56.合并区间|738.单调递增的数字|968.监控二叉树(可跳过)
为了避免冲突,新建一个数组负责合并和增加数组LinkedList转换为int二维数组,return res.toArray(new int[res.size()][]);//大小为3的二维数组flag为什么要进行初始赋值flag=0?因为输入可能本身已经满足条件了,不进入flag循环中。为什么遇到i-1的值>i的值,要用flag记录下来,而不是直接赋值?反例:1000,走到前面两位10时,如果直接赋值,结果为0900,但是正确输出时999。
2025-01-12 15:05:57
1007
原创 Day30补代码随想录20250109 452.用最少数量的箭引爆气球|435.无重叠区间|763.划分字母区间 【重叠区间的题】
用Integer内置的compare比较方法,不会溢出。刚开始需要一支箭二维数组的使用注意题目中说明,当两区间重叠于一点,也算重叠。例如,[2,3]和[3,4]这道题和射击气球的题目要求不同的一点是,当两区间重叠于一点,不算重叠。为什么按照左右边界排序代码这道题思路简单,但是代码细节较多。
2025-01-12 13:44:42
785
原创 Day29补代码随想录_20250108 134.加油站|135.分发糖果|860.柠檬水找零|406.根据身高重建队列
/特殊情况,环路行驶。当start=gas.length-1时,start=0,重新回到起点思路贪心方法在20元找零的情况1种,尽量用10+5来找零,5元尽可能地分配给10元的找零。注意排序的lambda表达式的用法声明的排列为<int []>型//p1是k的值,将当前p插入到第k个索引位置上。
2025-01-11 19:51:42
749
原创 Day28补代码随想录20250107贪心算法2 122.买卖股票的最佳时机II|55.跳跃游戏|45.跳跃游戏II|1005.K次取反后最大化的数组和
只要能想到思路,这个题很简单。注意优化,可以用Max和0的比较,来存正利润,这样就不需要再遍历一遍利润数组找大于0的利润了。关键代码是for(int i=0;i++){注意i<=coverRange,就是一步一步在扩大覆盖范围。当覆盖范围的尾部能覆盖掉最后一个元素时,说明能达到目标True算法有难度,要想清楚一个问题,就是每次跳跃的移动过程中,都在更新能达到的最大覆盖范围。每次达到上一次跳跃的end时更新end,更新后的end代表当前的覆盖范围内的所有跳跃方法中能达到的最大覆盖范围。
2025-01-10 22:17:53
970
原创 Day27补代码随想录20250106 理论基础|455.分发饼干|376.摆动序列|53.最大子序和
注意要理清每一句话的思路,从思路转换到代码选清主线,不是为每个饼干找合适的孩子不能优先考虑饼干是否被孩子吃了,这样会错过孩子。//g胃口,s饼干//饼干不一定都能喂到每个孩子,每个孩子不一定都吃饼干了。//饼干不能放在外边,一个饼干给好几个满足条件的小孩吃int j=0;//饼干s[j]//饼干被人选了之后,再换下一块i<g.length;i++){//遍历饼干result++;//遍历孩子数量j++;//放下一块饼干来选。
2025-01-10 19:40:08
637
原创 Day25补代码随想录20250104 491.递增子序列|46.全排列|47.全排列II|332.重新安排行程|51.N皇后|37.解数独
为什么不包含hash的回溯?因为每次进行一次新的递归,会重新建立一个hashSet注意Int i=0,没有startIndex,是因为这是有序的排列,可以取前面的元素通过path来检查相同元素(在同一个树中,如果取过该元素就跳过,继续取其他元素)因为结果是叶子节点,因此终止条件设置为如上。树层去重和树枝去重?两道题的组合,掌握used树层去重的方法和排列子集的方法。
2025-01-09 16:19:06
972
原创 Day24补代码随想录20250108 93.复原IP地址|78.子集|90.子集II
startIndex是一定需要的,不能重复分割,记录下一层递归分割的起始位置。情况很复杂,判断情况多,需要考虑得很全面,这道题挺难的。注意result.add(new ArrayList<>(path));//提前加进去结果,以免遗漏最后一个值 这句代码要加在终止条件之前,以免遗漏两个题的结合,没什么新知识点。startIndex树层去重+保存每个节点。
2025-01-09 12:00:06
920
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人