- 博客(132)
- 收藏
- 关注
原创 输出所有可能的出栈顺序
出栈,出栈路径out拼接上栈顶元素,栈顶元素出栈,入栈元素下标不变。当n==temp.length时表示字符串都入栈了。入栈,将下标为n的元素入栈,入栈元素下标n加1。要入栈的字符串 String temp。栈 Stack<Character>当栈为空时表示之前入栈的字符都出栈了。abc的所有可能的出栈顺序。字符串out记录出栈路径。2.确定递归结束条件。
2024-10-18 21:42:05 184
原创 jdk1.7中hashmap死循环问题
int i = indexFor(e.hash, newCapacity) 计算结点e在新数组中的位置i。让结点e的next指向新数组该位置的值newTable[i]int i = indexFor(e.hash, newCapacity) 计算结点e在新数组中的位置i。int i = indexFor(e.hash, newCapacity) 计算结点e在新数组中的位置i。int i = indexFor(e.hash, newCapacity) 计算结点e在新数组中的位置i。
2024-10-17 16:54:50 422
原创 查询和XXX同学学习的课程完全相同的其他同学学号和姓名
第四步:对这些同学group by后判断选课数量是否和xxx同学选课数量一样。第二步:not in找出选了其他课(xxx同学没选的课)的同学。第三步:选出不在上一步选出的同学中是同学。第一步:查询XXX同学选的所有课。
2024-10-17 14:26:35 204
原创 sql练习:计算次日留存率
现有用户登录记录表,已经按照用户日期进行去重处理。以用户登录的最早日期作为新增日期,请计算次日留存率是多少。:新增用户第二天登录(活跃)的用户;:t+1日留存用户数/t日新增用户;
2024-10-08 18:40:35 417
原创 销售额连续3天增长的商户
有一张订单记录表 t5_order 包含 订单ID(order_id),商户ID(shop_id),订单时间(order_time)和订单金额(order_amt),请查询出过去至少存在3天销售额连续增长的商户。
2024-10-08 14:37:11 353
原创 当前活跃用户连续活跃天数
COALESCE函数在 SQL 中用于返回其参数列表中第一个非NULL值的表达式。如果所有的参数都是NULL,那么COALESCE函数返回NULL。这个函数非常有用,尤其是在处理可能包含NULL值的数据时,可以提供一个默认值或备选值。
2024-10-08 10:51:26 226
原创 去掉最大最小值的部门平均薪水
有员工薪资表t3_salary,包含员工ID(emp_id),部门ID(depart_id),薪水(salary),请计算去除最高最低薪资后的平均薪水;(每个部门员工数不少于3人)是一个窗口函数,它为结果集中的每一行分配一个唯一的连续整数,通常用于数据的排序和分区。这个函数在处理数据分页、排名或者在分析查询中生成唯一的行号时非常有用。
2024-10-07 21:09:09 346
原创 连续点击三次用户
有用户点击日志记录表 t2_click_log,包含user_id(用户ID),click_time(点击时间),请查询出连续点击三次的用户数,连续点击三次:指点击记录中同一用户连续点击,中间无其他用户点击;
2024-10-07 20:49:10 321
原创 每年每门学科排名第一的学生 和每年总成绩都有所提升的学生
一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题:问题1:每年每门学科排名第一的学生问题2:每年总成绩都有所提升的学生是MySQL中的一个窗口函数,它返回与当前行相关的窗口框架的第一行的值问题2:每年总成绩都有所提升的学生。
2024-10-07 19:49:19 331
原创 滑动窗口学习总结
维持一个map记录p每个字符的次数,滑动窗口中的字符每出现一次,map对应位置的数-1。所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
2024-09-13 14:17:07 404
原创 sql练习:计算用户的平均次日留存率
p=(这段时间内所有用户连续两天登录的次数)/(这段时间内所有用户登录的总次数)记录一下今天遇见的一道sql题。
2024-09-11 16:57:48 425
原创 Day63:Bellman_ford队列优化算法 判断负权回路 单源有限最短路
Bellman_ford 算法每次松弛 都是对所有边进行松弛但真正有效的松弛,是基于已经计算过的节点在做的松弛。所以 Bellman_ford 算法 每次都是对所有边进行松弛,其实是多做了一些无用功。。基于以上思路,用队列来记录上次松弛的时候更新过的节点(其实用栈也行,对元素顺序没有要求)用基于队列优化的bellman_ford的算法模拟过程:94. 城市间货物运输 I。
2024-07-25 16:47:30 810
原创 Day62:dijkstra(堆优化版)和 Bellman_ford 算法
dijkstra(堆优化版):在上一篇中,讲解了朴素版的dijkstra,该解法的时间复杂度为 O(n^2),可以看出时间复杂度 只和 n (节点数量)有关系。在朴素版dijkstra中,我们从 节点角度出发,选源点到哪个节点近且该节点未被访问过在处理 三部曲里的第一步(选源点到哪个节点近且该节点未被访问过)的时候 ,我们可以不用去遍历所有节点了。而 直接把 边(带权值)加入到 小顶堆(利用堆来自动排序),那么每次我们从 堆顶里 取出 边 自然就是 距离源点最近的节点所在的边。
2024-07-23 20:28:13 1014
原创 Day61:拓扑排序 和 dijkstra算法
节点的入度表示 有多少条边指向它,节点的出度表示有多少条边 从该节点出发。所以当我们做拓扑排序的时候,应该优先找 入度为 0 的节点,只有入度为0,它才是出发节点如果有 有向环怎么办呢?当我们发现结果集元素个数 不等于 图中节点个数,我们就可以认定图中一定有 有向环!这也是拓扑排序判断有向环的方法。图解:117. 软件构建时间限制:1.000S 空间限制:256MB。
2024-07-22 16:17:30 829
原创 Day59:prim算法 和kruskal算法求最小生成树
最小生成树:最小生成树是所有节点的最小连通子图, 即:以最小的成本(边的权值)将图中所有节点链接到一起。图中有n个节点,那么一定可以用 n - 1 条边将所有节点连接到一起。那么如何选择 这 n-1 条边 就是 最小生成树算法的任务所在。prim算法 是从节点的角度 采用贪心的策略 每次寻找距离 最小生成树最近的节点 并加入到最小生成树中。prim算法核心就是三步,我称为最小生成树。
2024-07-20 18:47:18 728
原创 Day58:并查集 108.冗余连接 109.冗余连接II
,这说明在两条边都可以删除的情况下,要删顺序靠后的边!向树的性质,如果是有向树的话,只有根节点入度为0,其他节点入度都为1(因为该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点)。如果发现入度为2的节点,我们需要判断 删除哪一条边(导致入度为2的边),删除后本图能成为有向树。如果是删哪个都可以,优先删顺序靠后的边。删除特定的边才能变成有向树删除多条都可以,则删除最后加入的那条如果没有入度为2的点,说明 图中有环了(注意是有向环)。对于情况二,删掉构成环的边就可以了。
2024-07-19 19:45:44 822
原创 Day57:并查集 寻找存在的路径
并查集(Union-Find)是一种数据结构,用于处理一些不交集的合并及查询问题。确定某个元素属于哪个子集。通常是通过递归地查找元素的根节点(即其最终的父节点)来实现。查找元素x所在的集合的根节点。如果x的父节点是x本身,则x就是根节点;否则,递归地查找x的父节点的父节点,直到找到根节点。将两个子集合并成一个。将两个元素x和y所在的集合合并。首先找到x和y的根节点,然后将其中一个根节点的父节点指向另一个根节点。表示方法:通过模板,我们可以知道,并查集主要有三个功能。
2024-07-19 15:56:22 575
原创 Day56:图论 110.字符串接龙 105.有向图的完全可达性 106.岛屿的周长
110. 字符串接龙时间限制:1.000S 空间限制:256MB。
2024-07-17 20:46:43 881
原创 Day55:图论 101.孤岛的总面积 102.沉没孤岛 103.水流问题 104.建造最大岛屿
101. 孤岛的总面积时间限制:1.000S 空间限制:256MB。
2024-07-16 18:10:35 2221
原创 Day51:单调栈 LeedCode 42. 接雨水 84.柱状图中最大的矩形
那么因为本题是要找每个柱子左右两边第一个小于该柱子的柱子(当前遍历的值为单调栈中每个坐标对应的值的右边的第一个小于其的值,单调栈中每个值的左边的第一个值为其左边第一小于其的值),所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序!对于栈顶元素,栈顶往栈底方向的下一个元素,是第一个小于当前值的(从栈低到栈顶递增),所以对于单调栈很容易找到左边那个位置,如果接下来即将入栈的元素小于栈顶对应的值,那这个接下来要入栈的元素不就是我们要找的那个右边的那个值吗?个非负整数,用来表示柱状图中各个柱子的高度。
2024-07-12 20:08:17 1235
原创 Day50:单调栈 LeedCode 739. 每日温度 496.下一个更大元素 I 503. 下一个更大元素 II
思路:本题与上题思路一致,只是不是求nums2中所有数的下一个更大书,而是求其子集nums1中每个数的在nums2中的下一个更大数,所以我们要将nums1的值和坐标存下来。是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。思路:本题与上题类似,可以将两个nums拼起来,然后利用单调栈求出每个数的下一个更大的数。- 2 ,用加粗斜体标识,nums2 = [1,3,4,- 4 ,用加粗斜体标识,nums2 = [1,2,3,下一个更大元素是 3。
2024-07-11 17:12:35 740
原创 Day49:LeedCode 647. 回文子串 516.最长回文子序列
dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]。dp[i + 1][j - 1] 在 dp[i][j]的左下角。
2024-07-10 15:40:53 1335
原创 Day48:LeetCode 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇
和 dp[i][j] = dp[i - 1][j];所以当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});if (word1[i - 1] == word2[j - 1]) 那么说明不用任何编辑,dp[i][j] 就应该是 dp[i - 1][j - 1],即dp[i][j] = dp[i - 1][j - 1];
2024-07-09 14:53:38 1069
原创 Day47:LeedCode1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列
因为dp[i - 1][j - 1] + 1一定>=dp[i - 1][j] 并且dp[i - 1][j - 1] + 1一定>=dp[i][j - 1]可以看图理解。从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。text1[i - 1] 与 text2[j - 1]不相同,dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
2024-07-08 17:11:48 1324
原创 Day45: 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组
因为在之前有比当前nums[i]小的数时,dp[i]才被赋值,如果前面都没比nums[i]小的数,dp[i]就等于初始值,这个初始值应该为1,因为此时以Nums[i]结尾的子串长度为1。所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);=dp[i-1][j-1]时,dp[i-1][j-1]=0。dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度。最长连续递增序列是 [1,3,5], 长度为3。、长度最长的子数组的长度。
2024-07-06 20:21:40 529
原创 Day44:LeetCode 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费
1)操作一:第i天卖出第一支股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]1)操作一:第i天买入第一支股票了,那么dp[i][1] = dp[i-1][0] - prices[i]dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]-prices[i]);设计一个算法计算出最大利润。dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。
2024-07-05 19:56:42 1084
原创 Day43 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III
由递推公式 dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);和 dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i],因为一只股票可以买卖多次,所以当第i天买入股票的时候,所持有的现金可能有之前买卖过的利润。同时,你不能在买入前卖出股票。
2024-07-04 15:25:28 753
原创 Day42:动态规划 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
用start和end表示小偷能偷的房间范围,rob_能找出在某个范围内获得钱财的最大值,由于首尾不能同时取,所以小偷的偷窃范围只能是[0,nums.length-2]和[1,nums.length-1],这两个范围包括了首尾都不取的情况。你是一个专业的小偷,计划偷窃沿街的房屋。偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
2024-07-03 17:44:16 888
原创 Day41:动态规划 爬楼梯(进阶版)LeedCode:322. 零钱兑换 279.完全平方数 139.单词拆分
回溯法优化:记忆化搜索,使用memory数组保存每次计算的以startIndex起始的计算结果,如果memory[startIndex]里已经被赋值了,直接用memory[startIndex]的结果。如果确定dp[j] 是true,且 [j, i) 这个区间的子串出现在字典里,那么dp[i]一定是true。所以递推公式是 if(dp[j]&&[j, i) 这个区间的子串出现在字典里) dp[i]=true;dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false。
2024-07-03 16:25:34 879
原创 Day40: 完全背包 LeedCode 518. 零钱兑换 II 377. 组合总和 Ⅳ 70. 爬楼梯 (进阶)
dp[i][j]:表示前i件(包含第i件)物品能让容量为j的背包获得的最大价值1.不放第i件物品,这里和01背包一样,dp[i][j]=dp[i-1][j]2.放第i件物品,这里和01背包有区别,由于每件物品可以反复取,dp[i][j]=d[i][j-weight[i]]+value[i] ,01背包由于只能放一次,故当前方程由上一件物品得出,为dp[i][j]=d[i-1][j-weight[i]]+value[i]用一维dp数组解决完全背包:dp[i]表示容量为i的背包能装的最大价值。
2024-07-02 20:05:10 1253
原创 Day38:LeedCode 1049. 最后一块石头的重量 II 494. 目标和 474.一和零
由递推公式可知从上往下遍历。故:dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i]];组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],组合 2 和 1,得到 1,所以数组转化为 [1,1,1],,然后串联起所有整数,可以构造一个。有一堆石头,用整数数组。
2024-06-29 20:18:01 876
原创 Day37: 01背包 LeedCode416. 分割等和子集
放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值,所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);dp[i][j] 是由左上方数值推导出来。
2024-06-29 17:05:48 625
原创 Day36:动态规划 LeedCode 62.不同路径 63. 不同路径 II 343. 整数拆分 96.不同的二叉搜索树
dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
2024-06-27 18:59:47 870
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人