- 博客(260)
- 收藏
- 关注
原创 acwing 2 普通背包 2维做法的坑
接下来看二维的做法,首先讲一下,为什么需要二维的做法,因为一维无法满足部分题目的条件,比如说,如果需要我们找到放进背包具体是哪几个物品,一维的是无法保存历史信息的,在这个例子下我们就需要保存二维矩阵,再进行回溯。了,我们也不能跳出循环(这个会多消耗一些时间,但影响不大)而是要把上面的结果复制下来,算是和一维最重要的区别了。这个定义非常的巧妙并且很难直接想到,因此,很多dp题目会以背包作为变种,因此,背包是dp中非常经典的例子。首先看一维的做法,如下所示,比较简单,注意细节:在内层循环中,如果。
2023-02-15 18:14:44
353
原创 leetcode 40 组合总和2 auto循环内踩坑
但是这题在笔试时,包括做力扣时老是错,主要是循环内自己设置的变量总是被跳过,比如ct,这种变量一定要设置在循环开始,防止被循环中各种奇怪的continue跳过,导致没有进行迭代。先上代码,此题并不难,是一个标准的偏序回溯问题,甚至比组合总和1还简单一些。用map存一下数目即可。
2023-02-15 16:07:50
161
原创 leetcode 47 全排列,含重复元素
这个和全排列不一样的是,有重复元素,如果按全排列的做法,会把两个1计算两次,我们用一个map代替traversed数据结构,记录次数,每次–即可,思路和全排列一致。
2023-02-11 00:06:42
153
原创 leetcode 46 全排列
全排列是难一些的dfs,每个元素都要过一遍,而且要按不同顺序,复杂度相对于传统dfs更高,要额外记录一个traversed,记录走过的距离,并且需要额外的for循环,每次遍历所有数,复杂度是很高的。
2023-02-10 23:45:25
98
原创 go语言 leetcod1 两数之和
创建int,很简单,一行就行,创建map,还要make。大括号,必须不能在一起,教你做事,等号,也很奇怪。最简单的版本,直接初始化返回,不用创建map。:= 是声明变量并赋值,= 是赋值。就像这样,就可以不用给d定义了。
2022-09-11 19:07:33
137
2
原创 leetcode 182 使用having令group by少一层
但其实这一层是可以不必要的,使用having条件即可,这是专属于group by的操作,可以方便少一层select。看到此题,一瞬间就完事了啊,直接一个group by再嵌套一层完事。
2022-08-12 13:51:16
126
原创 leetcode 1407 ifnull,多条件排序
此题还是比较有意思的,如果有名字不在行驶记录中,那么他的成绩是0,也要计入表里,这里可以通过left/right join外加ifnull来实现。注意:ifnull对非null值是不做处理的,如果想对非null值也处理,可以用if函数。之后就是order by,优先级高的放前面,像group by一样。...
2022-08-11 15:27:44
140
原创 leetcode 511 日期操作
此题希望找出每个id的最小日期,如果是最小值很好操作,用min就可以了。那么最小日期其实用min也ok哈哈哈。datediff函数可以让我们得到两个日期差的日子,但min,max操作对date对象依然是成立的,很不错。...
2022-08-10 18:00:42
137
原创 leetcode 1141 少一层嵌套select
想法很简单,我们先group by,第二层用where选出count > 0并且日期符合要求的组,但其实是没有这个必要的,因为count = 0的行在group by时根本不会被提取出来。所以可以用下面的单层嵌套解决。重命名可以不用as,直接命就行,nice。选出30天,每天的活跃用户数目。解法二:单层select。...
2022-08-09 14:31:05
101
原创 leetcode 197 cross join和自交
此题需要两两比较找到每两个日期差为一的对,因此我们要使用cross join来操作,并且需要自交,这里要用到别名方法,特别简单,select时写一下就行。此外,datediff这个函数可以帮忙判断日期差,很舒服。......
2022-08-09 13:36:22
72
原创 leetcode 176 子查询,ifnull,limit,offset
当提取的是一个数字时,我们就可以将其作为一个属性常量。在此题中我们也可以利用这个特性,首先抽取出这个常量,如果是null也可以提取出,然后将他作为常量拿出即可。首先讲讲ifnull函数,这个函数和if不太一样,if可以用于属性值不同case的多路选择,但ifnull的输入一般是一个值(?首先介绍一下子查询的概念,最常见的就是list提取,我们也经常用的。subquery提取的可以是一个列表,一张表,或者是一个数字。和上面的代码对比,我们只是加了一个函数,并且完全是多余的。解法二:ifnull。...
2022-08-08 17:39:30
1327
原创 leetcode 608 选取list时记得去null
这个题目还是比较典型的,在提取list时记得要把null排除掉,不然用in操作时会出现bug。
2022-08-01 20:33:00
80
原创 leetcode 1795 sql表的拆分,行转列
然后离谱的事就发生了,tm的就不对啊。然后我就研究了一会,发现原来sql是不能!=null的,一定要isnotnull才行。此题一眼看去完全不会,经题解指点,发现可以讲常数值直接定位列的值,结合union可以非常巧妙额解决,于是我就画了个葫芦。...
2022-08-01 20:21:07
174
原创 leetcode1965 表的属性融合 选取list
事实上我们无法合并属性,但可以通过表的union进行合并。并且可以通过select获取list进行in的操作,还是很妙的。正常我们可以通过fulljoin把两个表连接起来,但是需要把两个表的雇员id属性给合并,这一步不太会做。...
2022-08-01 20:06:39
101
原创 leetcode 1527 sql 正则、通配符匹配
正则的规则更为复杂,有时可以处理更为复杂的情况。其中,匹配空白字符可以用\s,因为\s是空格,^代表字符串开始位置。此题需要再conditions字符串中找到满足条件的子串。用算法做的话都很麻烦,但是正则和通配符就非常方便。上述方法是错误的,因为可能会匹配到ADIAB1这类字符串,所以可以把第一个单独考虑,即。通配符的方法很简单,使用like,用%代替其余字符即可。......
2022-07-31 13:09:45
440
原创 leetcode 1484 group by collect_list替代
我们可以使用group_concat函数将商品列表变成字符串,还是挺简单的。但这样无法提出商品列表,只能提取一个商品。
2022-07-26 15:23:07
176
原创 leetcode 1667 sql中字符串处理函数
此题主要考差了sql的一些字符串函数,比如upper,lower,left(取左边的子串,输入位置),substring(取右边的子串,输入位置),concat(连接字符串)等。题目要求使用select查询,也不用改了(一般在hive上也不改)。...
2022-07-26 15:11:50
343
原创 leetcode 196 选择性删除
这样,但是此题列出了两个表,要删除第一个表中不是最小的部分,可以学习一下这种写法。第二个表就是纯工具表,没什么用的那种。要删除email相同里id不是最小的部分,这个还是比较复杂的。这题真的无敌了,删除一下还这么费劲。可以看到并没有直接删除。...
2022-07-26 14:52:06
594
原创 leetcode 627 使用if更改表
但正常这样改的话,无法一次进行全部改进,可以使用下面的更改方法。此题中,我们正常应该用update来改。直接将if语句进行赋值更改,非常的妙。
2022-07-26 14:35:39
89
原创 leetcode 1873 sql中的if
此题中需要在select里写if语句进行判断,我们可以用sql中的if来实现,if函数中有三个参数条件,值1,值2。另,orderby默认从小到大排序。如果条件满足就取值一,不满足就取值2。
2022-07-26 14:25:00
257
原创 leetcode 183 表的合并
我们可以将第二个表中的一列取出来,然后找不在里面的即可,这样更简单。我们需要将两个表关联才行,所以可以想到leftjoin。解法一leftjoin。解法二无合并直接去掉。
2022-07-24 23:38:02
99
原创 leetcode 584 null值的比较
sql的null值不能直接和值比较,需要用isnull或者isnotnull来判断。但这种方法会把所有null值过滤掉。
2022-07-24 23:14:14
113
原创 leetcode 595 union加速
这样写是不对的,会把有的列弄没,两个表得一致才行。这样就对了,但经过实测,也没快多少。解法二利用union加速。上述算法较为直接,但速度慢。
2022-07-24 22:57:43
326
原创 阿里笔试 填充型二分
牛牛上幼儿园,有5个数,每次选择4个数进行减一操作,牛牛没学过负数,所以减到0就停止了。 问最多可以减多少次,5个数范围:1e9此题贪心很难做,和力扣2141类似,有点像填充型二分,但还是区别挺大的。我们考虑最多能减x次。当然,由于每次需要减4个数,我们不可能真的去减,有些难以操作,我们可以考虑,每次有一个数不减。我们换个思路考虑,如果说要减x次,如果其中一个数大于等于x,那么每次减他都可以,如果有4个数以上大于等于x,那么x肯定是满足要求的。但如果有数 aaa 小于 xxx,那么他至少要被豁免 x−
2022-04-11 16:51:51
221
原创 leetcode 2141 填充型二分
此题还是挺难想的,首先做一个假设,假设n台电脑最多能运行x分钟,如果所有电池加起来能运行nx分钟,能不能满足要求?考虑第一种例外,即如果有电池电量大于x,那么它给x充满电后,也没有时间再给别的电脑充电了,所以如果有电池电量超过x,那么一定满足不了要求。所以我们应该做一下裁剪,让每个电池电量和x取最小值。那么我们接着考虑,裁剪后,如果所有电池加起来能运行nx分钟,能否满足要求?这个是可以满足的,证明也很简单,我们直接在每个电脑上累加电池,直到大于等于x。不管等于的,我们会得到一批大于x和小于x的电脑。我.
2022-04-11 15:25:03
462
原创 leetcode 2217 O(1)时间找长度l,第i个回文数
此题给定了时间范围后,可以退化为题目所述的问题,即在 O(1)O(1)O(1)时间找到长度 lll,第 iii 个回文数。解决这个问题,我们需要从回文数的性质入手,即前后是对称的,如果是奇数的话,就多看一位,对折前面几位,还是比较简单的。还有就是快速幂,typedef long long ll;class Solution {public: ll power(ll a, ll n) { if(n == 0)return 1; ll res = pow.
2022-04-01 23:21:14
174
原创 leetcode 2216 美化数组的最少删除数 dp&贪心两种做法
解法一:动态规划(dp)一般这类线性问题都可以用dp解决,我们定义 dp[i]dp[i]dp[i] 为前 iii 个元素组成美化数组的最少删除数。根据题目定义,如果是奇数个元素,那么就要删除一个元素,所以 dp[0]=1dp[0] = 1dp[0]=1。前两个元素可以根据相不相同来进行删除,如果两个相同必须全部删除,公式如下所示:dp[1]={2dp[0] == dp[1]0dp[0] != dp[1]dp[1]=\begin{cases}2& \.
2022-04-01 22:26:41
335
1
原创 leetcode 2218 分组背包
此题只能从上往下挖,可以将每个坑看做一个组,从而转化为分组背包问题,即每组最多取一个物品。我们将其转化为01背包的思路,dp[i][j]dp[i][j]dp[i][j] 表示前 iii 组物品在容量为 jjj 的背包中得到的最大价值。由于每组最多之恶能选一个,如果不选,则dp[i][j]=dp[i−1][j−1]dp[i][j] = dp[i-1][j-1]dp[i][j]=dp[i−1][j−1]如果选的话,只能选其中一个,我们需要枚举每一个物品的 www 和 vvv,dp[i][j]=max(dp.
2022-04-01 16:49:22
4842
原创 LCP 47 困住无辜的人 背包装满方案数
此题的队列是完全没用的数据结构,栈的作用是困住无辜的人,容量为 bbb 的栈,会困住 b−1b-1b−1 个无辜的人,所以我们需要把数组中每个数减一,然后看他们如何拼满 kkk 个人。此题最重要的是进行题目解析,减一后转换为背包装满问题就很简单了。之前比赛时压力比较大,理解为从 nnn 个物品中做选择,如果选 mmm 个,求出能装满容量为 m+km+km+k 的背包的方案数。其实就每个减一就行,但是脑子没有转过弯,就很难受。class Solution {public: int secur.
2022-03-24 15:50:43
877
原创 leetcode 2212 二维01背包回溯
此题要射箭,而且必须比Bob多一支,所以如果决定了要射哪个靶子,那要射的箭的数目是一定的。所以,我们可以将这个问题转化为01背包问题。注意,此题需要做回溯,而背包做回溯和最长上升子序列不一样,是需要存二维数组然后回溯的。我们应该知道,一维01背包是由二维背包转化而来的。背包问题的核心是选或者不选,dp[i][j]dp[i][j]dp[i][j] 表示前i个物品的最佳组合在容量为 jjj 的背包中取得的最大价值,即dp[i][j]=max(dp[i−1][j],dp[i−1][j−w[i]]+v[i]).
2022-03-24 14:52:08
229
原创 leetcode 2203 单源最短路中转
此题看题意还是挺难的,但我们可以想象一下最终获得的子图是个什么形状:一定是图中有任意一个节点,两个出发点先到这个点汇合,再去终点。所以,我们通过dijkstra算法求三个点的单源最短路,其中终点的最短路需要存反的邻接表。然后枚举每个中转点即可。注意:dijkstra有几个优化点,一个是用两层vector实现邻接表,用map会慢。还有就是用-1初始dis表会好一些,如果用大数还需要考虑溢出,而且初始化较慢。typedef long long ll;typedef pair<ll, int>.
2022-03-19 16:20:42
213
原创 leetcode 743 单源最短路算法 bellman-ford, dijkstra
此题要求单源最短路,最简单但是较慢的算法,利用动态规划求解。bellman-ford:动态规划最短路首先理解一个概念:n个节点构成的图,最短路最长是n-1条边构成,这个比较直观,如果多了一定走了弯路我们每次选取一个边,更新源节点到边终点的距离,dis[to]=min(dis[to],dis[from]+pow)dis[to] = min(dis[to], dis[from] + pow)dis[to]=min(dis[to],dis[from]+pow)我们管这一步叫做松弛操作,所有边松弛一次,代表.
2022-03-18 22:06:33
594
原创 leetcode 2197 用栈模拟质数合并
此题并不需要什么算法,模拟即可。但是复杂的模拟方式可能带来很长很丑的代码。此题说了,任意顺序合并都可以得到相同的结果,所以此题可以用单调栈的思想解决,从左边开始,每次弹出两个,不断合并,如果右边可以合并完成,一定会反馈给左边,还是很玄妙的。class Solution {public: int gcd(int a, int b) { if(b == 0)return a; return gcd(b, a%b); } vector<.
2022-03-12 17:18:15
7767
原创 leetcode 2196 非拓扑排序建树
此题乍一看很像拓扑排序,但仔细想一想,就算用拓扑排序排好了,建树按那个顺序是建不起来的。细想,这题其实挺简单的,因为你只需要每次连一条边,用map存节点即可。唯一问题就是根节点怎么找,由于是连通图,只需要看看谁没有爸爸即可,我们存起来所有有爸爸的,剩下的就是根节点。class Solution {public: TreeNode* createBinaryTree(vector<vector<int>>& descriptions) { uno.
2022-03-12 16:07:03
133
原创 leetcode 2195 思路转化
此题看起来比较简单,但最卡人的是这个数据范围,K最多是1e9代表我们无法枚举K,但可以换一种思路,即我们一定是取1-K这K个数的,所以前面出现了哪个,我们就将边界+1,同时把前面的算好即可。由于数组中的重复数没有用,我们排序后与上一个比较去重即可。累加时,用分段累加就可,保证不会溢出。typedef long long ll;class Solution {public: long long minimalKSum(vector<int>& nums, int k) .
2022-03-12 15:34:39
168
原创 leetcode 2188 归约后线性dp
此题第一次看较为复杂,但有几个条件比较重要,一个是每种轮胎都是无限个,这个减少了太多难度,此题最难想的地方是,不要想选哪个轮胎,走多久,而是看一段固定的距离,哪个轮胎走花的时间最短。因为最终一定是分成一段一段的。之后,我们要考虑这个固定的距离最远有多长,由于指数的底最小是2,可以算出20即可满足要求。之后,下一个难点就是要考虑线性dp,从第一个开始,枚举前20个算出每个的最优,dp[i]dp[i]dp[i]定义为走iii圈花费的最短时间。考虑好这些后,代码就较为简单了,还有就是要用ll防止爆int。.
2022-03-07 16:14:35
104
原创 leetcode 29 两数相除 二进制表示问题
此题主要要解决的是如何用减法模拟除法,如果一个一个减,是一定会超时的,效率也特别低。我们利用多重背包中的知识,即一个数可以由他的多个二进制组合表示。所以,我们从刚好小于他的二进制数开始减即可,如果不够了就让减数除以2,这样能实现log级别复杂度的算法。typedef long long ll;class Solution {public: int divide(int dividend, int divisor) { int sign = 1; if(div.
2021-10-24 21:17:17
156
原创 leetcode 808 概率dp及递推证明过程
此题是典型的概率dp,概率dp需要从小往大走,n方次循环即可,比搜索简单很多,由于题目中均为25的倍数,我们可以将所有参数除以25。此题的递推公式是dp[i][j]=0.25∗(dp[i−4][j]+dp[i−3][j−1]+dp[i−2][j−2]+dp[i−1][j−3])dp[i][j] = 0.25*(dp[i-4][j] + dp[i-3][j-1] + dp[i-2][j-2] + dp[i-1][j-3])dp[i][j]=0.25∗(dp[i−4][j]+dp[i−3][j−1]+dp[i.
2021-09-23 21:59:55
233
原创 leetcode 69 求平方根
题目不用再说了,但一个要求是要返回整数,这就存在一个问题,就是输入为1的时候,永远不可能得到1,因为int是向下取整,所以对于1要特殊处理。class Solution {public: int mySqrt(int x) { if(x == 1)return 1; double l = 0, r = x; if(x < 1)r = 1; while(l<r) { double
2021-09-15 15:58:14
84
原创 leetcode 297 二叉树的序列化和反序列化
此题虽然标注是困难,但还是不难的一个题。首先要想如何表示节点而不引起歧义,这里的做法是用括号括住每个节点的数值。然后就是正常的bfs编码解码即可。解码时可以先去掉括号,然后处理很简单。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), lef.
2021-09-15 11:03:30
81
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人