随笔分类 - 算法与数据结构
学习中
摘要:今天依然是一道图 最多删除多少边 等价于 最少多少边就可建图 这样考虑的话就可以引入贪心,不然删除的角度不太符合并查集的操作方法。
阅读全文
摘要:今天是第二次遇到差分数组了 主要作用:一个区间内(比如下标i到j)批量修改同一个相对值(比如都加1都减5)的时候,可将$O(n)$变成$O(1)$ 好像没什么了。今天这题如果我熟悉差分数组,只能说有可能做出来吧。关键还在找到区间修改的那个规律。
阅读全文
摘要:正好实验课遇到,就重温一下这两个算法吧。 测试用例都是简单的一个7个点的例题。 1.Dijkstra import java.util.Arrays; import java.util.HashSet; import java.util.PriorityQueue; import java.util
阅读全文
摘要:1. 邻接矩阵 //设有矩阵e[n][n],其中n是图中点的数量, //则e[i][j]表示从点i到点j的距离(边的权重) 2.邻接表 因为图可能不是完全的,所以有很多的点之间互相并没有边相连,这种情况下若使用邻接矩阵,无疑会造成空间的浪费。 所以不妨采用列表的方式存储。 可以有两个思路 列表套列表
阅读全文
摘要:这题朴素的O(nk n) 的记忆化搜索方法是很容易的, 但是关键就是将其中一层n的循环有效的优化成logn。 原始的情况是对 \[ t \in [1,n] \] 的每一个$t$,计算 \[ min(max(f1(t), f2(t))) \] 想到这直接的想法肯定就是来个循环,遍历每一个关于$t$的$
阅读全文
摘要:单链表找环(floyd算法) 首先是示意图,链表中有环就是这种情况 问题是,在这样一个单链表中,若有环,寻找出环的入口 floyd算法是怎么做的呢? 快慢指针,同时从起点开始走。 设环路长度为l, 则当 \[ 2t - t = kl(k是整数) \] 时,快人和慢人相遇。 这时我们并不知道相遇点在哪
阅读全文
摘要:迭代先序遍历二叉树 朴素的想法就是,照着递归把栈实现出来 都知道递归就是栈,也知道递归形式很简单 dfs() { cur; dfs(left); dfs(right); } 关键是怎么把递归用到的栈显式写出来 能想到一个简单的对应关系, 就是递归的当前轮次,也就对应着迭代的栈顶。 那怎么进入下一层,
阅读全文
摘要:今天是leetcode685 冗余连接 这题容易想到的是有几种情况能找到多余的边 有两条边同时指向某个点(冲突) 根节点被某条边指向(成环) 用如下代码记录冲突和环路 if(p[to] != to) {//若该边指向的点已有父点,则产生冲突 con = i;//记录冲突边 } else {//若该边
阅读全文
摘要:记录一下kruskal算法 将所有边按权重排序 从排好序的边集中依次取出,若当前选到的边不会让现有的若干个树成环,则选中该边 选到n-1条边后结束
阅读全文
摘要:今天又做了一道和数组有关的题 想说的是,在有数组的情况下,用下标就可以包含想要的信息,而不是一定要相应的值。
阅读全文
摘要:leetcode秋季赛第3题-秋叶收藏集 这题看了答案之后一直在想为什么能这么转移 后来一想,对于每一个长度的leaves,去掉最后一片树叶之后,只有可能是三种排列,也就是 rrrrr rryy rryyrr 因此转移就相当于分解成n-1个和最后一个分别求最小次数后相加,因为当前状态只可能从前一步的
阅读全文
摘要:又看了一遍dijkstra算法 主要是bfs的思想,从起点一步一步扩展到终点 将图分为已到达和未到达 主要根据是图中不存在负权边,所以在已到达部分的边缘,下次将会触及的那一圈邻居,其中有一个距离起点最短的点,那这个点的最短路径一定是当前路径。 这是为什么呢 因为已到达的点,他们已经将他们的邻居遍历过
阅读全文
摘要:回顾了一下floyd算法 这个方法思想就是dp。 在最外围对每一个点依次循环,每一个点都要作为中间点将所有边松弛一遍,进行完之后第i个点和第j个点之间的最短路径就已经求出。 这个方法为什么是对的呢? 动态规划的重要特点就是,当前的结果作为前提,充分信任它,以它为基础得出后一步结果,最后得到最终结果。
阅读全文
摘要:今天查看了java文档中的sort方法 发现java中的Arrays.sort()不再使用经典快排,而是用了来自 Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch的双pivot方法: 于是我又查看了一下网上的介绍,发现这种方法之所以比经典快排要
阅读全文
摘要:今天是leetcode300 这题O(n^2)的方法很简单,他让进阶是O(nlogn),其实能logn的方法是少之又少,无非就是二分或者分治,但是我还是没想出来,服了。 我的心路历程是 看到他一个特性,就是相同长度的子序列而论,以更大数为结尾的子序列就可以抛弃了。比如[1,2]和[1,3],对于长度
阅读全文
摘要:今天了解了一下摩尔投票法 原题是leetcode229 注意题目中有个条件是 找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 这个条件给我们的提示就是,不到⌊ n/3 ⌋ 次的人,一视同仁。 基于这样的约定,我们才可以设置两个固定坑位之后,遍历数组。 也就是说,本来在坑位上的人,如果不足以达到n/
阅读全文
摘要:有时候代码超时 不一定是复杂度超了,有可能是有的地方死循环了。
阅读全文
摘要:今天的leetcode1268又用上了二分搜索。 首先有很多东西因为我能上网一搜就搜出来,所以就懒得记录了。就好像看书一样,当我确定下次我翻到这一页只需要几秒钟就能重获我所需的知识,就没有必要去争取把它记下来了。 这题标答肯定是字典树,不过我在做题的时候比较抗拒这种高级数据结构。比如什么线段树字典树
阅读全文
摘要:第3题是二分猜测+验证,我没想到,下次努力。 第4题看到一种方法是选择性记忆化搜索,把减1操作给优化掉,确实很有道理。 菜鸟想要长进就靠见多识广了。
阅读全文
摘要:这题看到题目就想到用前缀和和dp,但是一时间没想到怎么寻找子数组的和。因为随着dp到每一个位置再去遍历前面数组来找有没有和满足target的话,时间复杂度就要来到O(n^2)了。 然后我看了大佬的题解,用map维护前缀和和位置,并且在遍历到某一位置的时候直接用sum[i+1] - target 输入
阅读全文

浙公网安备 33010602011771号