算法
文章平均质量分 93
梦呓0104
这个作者很懒,什么都没留下…
展开
-
01背包和完全背包(java)
所有的w和v数组下标都按从1开始了,方便描述问题,需要改就在用到w和v的地方下标-1就行。01背包给定n个物品,体重分别为w1,w2,w3…,价值分别为v1,v2,v3…,且每个物品只有一件,现在有一个容量为C的背包,求最多能装价值多大的东西。通过枚举物品种类和背包的容量来解决该问题,现在假设有4件物品,对应的体积和价值如下表所示,背包的容量为10。i1234w(体积)10345v(价值)3467dp状态表如下所示,dp[i][j]表示当前只有i原创 2021-06-11 14:44:42 · 1171 阅读 · 0 评论 -
单调栈(java)
和单调队列比较相似,也是数据结构内存储的数据是单调递增或单调递减的,但是因为栈是先进后出的,所以在用法上是和单调队列不同的。之前的博文里讲到单调队列可以动态维护当前队列中的最大值/最小值,单调栈则可以用来求当前数左侧/右侧第一个比它大/小的数,下面通过简单的例题解释这句话到底什么意思。给定一个数组,求数组中每个数字下一个比它大的数,如果不存在,对应-1例:[1, 3, 4, 2],输出的数组为:[3, 4, -1, -1][6, 5, 4, 3, 7, 8, 9]输出的数组为:[7, 7, 7, 7原创 2021-03-06 13:39:23 · 828 阅读 · 0 评论 -
单调队列(java)
单调队列,顾名思义,就是队列中的值要么单调递增要么单调递减。之前做题的时候对这个并没有太在意,但是今天的每日抑题用堆实现的时候发现太耗时了,借此机会好好学一下单调队列。leetcode1438求满足条件的最长连续子数组的长度,一看就是滑动窗口的题,按着模板来就行,但是这里难的点在于要维护窗口内的最大值和最小值,只要保证在扩张右边界和收缩左边界的时候可以拿到窗口内的最大值和最小值,这个题就迎刃而解了。所以第一想法是用两个堆来分别维护最大值和最小值,代码如下:public int longestSubar原创 2021-02-21 13:43:33 · 2326 阅读 · 1 评论 -
滑动窗口2(java)
接之前写的,做了几道比模板题难的,又有了一点新的理解。先说点题外话:逆向思维很重要。之前面试的时候就被问过一道sql题,大致是有几张成绩表,主键是学生id,让挑出所有成绩都在90分以上的学生,我当时还想着一个主键对应多个科目,可能还要分组什么的,很麻烦,最后写的不是很理想,但是面试官一句话点醒了我“你有没有想过把低于90分的学生先挑出来”,这样确实就简单得多,只要有一门低于90就被排除,用not in语句就可以了。包括力扣上也有很多题用逆向思维做就比较容易,比如我印象比较深的是一道贪心的题,leetcod原创 2021-02-09 17:40:17 · 167 阅读 · 0 评论 -
双堆求中位数(java)
二分查找求中位数需要数组有序,而且不能求动态数据的中位数,双堆就可以很好地解决这个问题。思路也比较简单,用大顶堆存较小的部分,用小顶堆存较大的部分,同时要维持两个堆的大小相差最多为1,这样求中位数的时候要么取某个堆的堆顶,要么求两个堆顶的平均值。其实堆的问题最容易搞混的还是到底用什么堆存什么数据,比如求topk大的数就应该用小顶堆,求topk小的数就应该用大顶堆,还是要自己好好琢磨琢磨。上代码:(规定maxHeap要么和minHeap一样大,要么比它多一个。看个人习惯,也可以minHeap多一个)pu原创 2021-02-03 13:14:13 · 746 阅读 · 0 评论 -
并查集(java)
并查集leetcode这个月怕是图论月,每日抑题老出并查集,之前没仔细钻研过。今天看了一下之前的官方题解和别人的模板,自己总结一下,中间有几张图用了菜鸟教程的。并(Union),代表合并查(Find),代表查找并查集的典型应用是有关连通分量的问题实现最简单的版本用数组记录每个节点的根节点,只要两个节点的根节点是一样的,那么这两个节点就是连通的,比如现在就有两个连通分量,[0, 1, 2, 3, 4]是一组,[5, 6, 7, 8, 9]是一组。在初始化的时候需要让每个节点的原创 2021-01-15 15:21:48 · 224 阅读 · 1 评论 -
滑动窗口(java)
滑动窗口是双指针的一种应用,它的特点就是窗口要么扩张,要么向右滑动,不存在窗口缩小的情况。这样当O(N)遍历一遍后,窗口的长度就是要求的最大值。先看一道最简单的滑动窗口题,给定一串字符串(只包含大写字母),求最长连续序列的长度。这道题用普通的双指针或者别的做法都能做,但是这里用滑动窗口演示一下:例:ABAA----2 AAAA----4 ACDBB----2 …开始这两步和普通的双指针没什么区别,left不动,right+1,代表窗口扩张,但是当碰到 “B” 的时候,我们并原创 2021-02-02 14:26:50 · 2259 阅读 · 2 评论