- 博客(48)
- 收藏
- 关注
原创 第 26 场 蓝桥月赛 部分题解
找到大于等于k+curVal的最近下标,更新当前位置,然后又往后找大于等于k+curVal的最近下标,就这样直到没有了。时间复杂度有点高,所以没全过。分析:通过画图找到规律,可以在对角线上放,要么在(1,j)和(j,1)上放,这次在前面的基础上来放,难点就是找规律,dp[i]=dp[i-1]+(n-1) * dp[i-2] ,dp[i]表示在i*i的盘子上的摆法。分析:给你一些汤圆,你要知道无论怎么倒,最后得到的数量不会增加。,在给定的k下,找出满足条件的最多人数。,差异越大越好,最小的肯定选中,然后用。
2025-03-30 19:55:45
319
原创 15届蓝桥JavaB组 前6道题解
测试剂的期望=(n/k) * (1-p)^k + (n/k) * (1-(1-p)^k) * (k+1)一共有n/k个小组 我们知道:有毒的小组数量=总小组数量 * 一个小组有毒的概率。一个小组没有病毒的概率是(1-p)^ k,有病毒的概率是1-(1-p)^k。这些小组中没有病毒的个数是(n/k) * (1-(1-p)^k) 个。这些小组中有病毒的小组有(n/k) * (1-p)^k 个。一共有n只,每个小组k只,所以一共有n/k 个小组。有病毒的概率是p 没有病毒的概率就是1-p。
2025-03-29 14:00:48
467
原创 蓝桥月赛 第27场
思路:涉及了二分,红队是按照输入顺序来上场的,蓝队是挑选上场的,要使得蓝队赢的多,蓝队出场顺序一定是从小到大出场,每次红队出场一人,蓝队出场一人后,蓝队出场者要与红队上场的所有人比较,找出拳头较小的个数然后累加。思路:涉及到排序,要求小蓝和小乔的报酬总和最大,对于任一班谁的报酬较大就让谁选择, 如果先让小蓝进行选择前n/2个班,我就要使得前n/2个班中小蓝的报酬大于小桥的,差值越大越靠前,思路就有了,先对数组二维数组按照 小蓝-小乔 的报酬从大到小排序,然后小蓝选择前n/2个班,小乔选择后面的班。
2025-03-25 16:53:49
751
原创 牛客周赛 86 DE
思路:凸多边形满足条件:所有边的长度之和-最长边>最长边,类似于三角形中的最短边+次短边>最长边。接下来就是看怎么求最小凸多边形周长呢,首先将数组从小到大排序,接着枚举最长边,将其他若干边中找出大于最长边的子集,最小化子集,更新答案即可。这思路看起来比较抽象,可以直接看代码注解。思路:我们想,最多有3种 ,将x和y重复进行两次,出现相同的数字,然后位异或就是0,所以答案就是1、2、3,先讨论为1的情况,只有两种&和^,然后讨论为2的情况,情况比较少直接枚举就可以了,剩下就是为3的情况。
2025-03-25 10:09:06
161
原创 二叉树题目(遍历+分解思路)
注意:onPath用StringBuffer类型,方便将增删,增的方法就是。注意:String中的join方法。方法变成Integer类型相加。,方便转换成String形式用到。,然后用Integer的。
2025-03-20 18:34:53
270
原创 最近公共祖先
思路:题目要求你找到以root为根的树上p和q的最近公共祖先,将大问题分解成小问题,如果该根节点是p或者q,就说明根节点就是最近公共祖先,如果不是,就去左右子树上寻找,如果root的左子树和右子树都找到了,就说明q和p在root的左右子树上,那么根节点就是root,否则就返回不是空的左子树或者右子树的值。思路:如果用上面的代码可以通过,但是复杂度较高,这里是搜索树,满足。,然后于根节点比较,
2025-03-20 11:24:24
526
原创 栈的题目leetcode
对于栈这种数据结构的考察,主要考察先进后出特点的运用,比如表达式运算、括号合法性检测等问题,下面列出几个使用栈的经典场景。② 当前的事右括号,看看栈顶是不是对应的左括号,如果是就pop,不是就进栈。思路:有这么几种情况:① 当前的括号是左括号,直接进栈。思路:链表只能从头到尾,需要借助栈来得到从尾到头。最后如果栈为空,就返回true。
2025-03-13 12:23:30
240
原创 图论题目。
Kruskal: 将所有边按照权重从小到大排序,从权重最小的边开始遍历,如果这条边和 mst 中的其它边不会形成环,则这条边是最小生成树的一部分,将它加入 mst 集合;Prim: Prim 算法的逻辑就是这样,每次切分都能找到最小生成树的一条边,然后又可以进行新一轮切分,直到找到最小生成树的所有边为止。后序遍历的这一特点很重要,之所以拓扑排序的基础是后序遍历,原因:我的res写在了前序遍历的位置,应该写在后序遍历的位置。(DAG)的顶点进行线性排序的一种算法,其实特别简单,把图结构。
2025-03-02 20:04:56
438
原创 分治算法+题目
把递归算法抽象成递归树,如果递归树节点的时间复杂度和树的深度相关,那么使用分治思想对问题进行二分,就可以使递归树尽可能平衡,进而优化总的时间复杂度。
2025-03-02 19:50:10
252
原创 贪心算法+题目
拿到题目就暴力穷举,我用的是dfs,加上备忘录之后还是超出时间限制。就考虑一下贪心算法。你想 我在[0,n-2]位置遍历求出可以跳跃的最远距离,用farthest更新最大值,如果>=终点就返回true。DFS递归:时间复杂度最坏是O(N*N)贪心:时间复杂度O(N)
2025-03-02 19:27:44
1028
原创 经典题型:求数组中逆序对的数量
总结:在合并的过程中,如果前面区间指向的元素小,不用管,如果后面区间的小,就要加上前面区间的个数。步骤三:前面数组指向的元素2较小,放回原始数组,2与后面数组不构成逆序对,不管他。步骤二:1与前面的区间,构成逆序对,个数就是前面区间的个数。步骤一:两个指针指向两个有序区间,进行合并操作。
2025-02-09 20:25:03
233
原创 【单调队列题目】
与优先级队列区别:优先级队列底层是小堆,按照大小顺序出队列,不符合队列性质“先进先出”,单调队列一般和标准队列一起配合解决滑动窗口问题。
2025-02-09 12:30:08
380
原创 【位运算题目】
对[l,r]区间操作,用到掩码,创建掩码是关键,掩码就是[l,r]上是1其余是0的二进制,得到掩码第一步,生成[0,r]为1其余为0的二进制,(1<<(r-l+1)-1),第二步,生成[0,l-1]的二进制b,第三步,a-b得到掩码。
2025-02-02 10:57:12
233
原创 搜索二叉树(增删查)
知道BST的中序遍历是有序的,思路打开,可以中序遍历二叉树然后判断结果是不是有序的,有序就是搜索二叉树,否则不是。有两个方法:①可以用一个变量max来记录最大值 ②遍历过程中直接比较前后节点。
2024-11-25 21:42:02
180
原创 二叉搜索树(中序遍历特性)
思路:首先看每个节点应该做啥,发现每个节点做的事情不一致,有的节点是右子树之和加上自己,有的还要加上父节点。所以不能简单的递归做同样的事情!此路走不通就换一条,思路:中序遍历后返回第k大的值。
2024-11-24 15:27:27
293
原创 【环检测与拓扑排序(java)】
为什么环检测和拓扑排序放在一起,因为在拓扑排序之前要检查一下图中是否有环,拓扑排序的前提是不能有环。环检测与拓扑排序都有两种方法:BFS和DFS。针对的是:有向图。
2024-11-04 21:27:04
455
原创 【BFS】
问题的本质就是让你在一幅「图」中找到从起点 start 到终点 target 的最近距离。bfs是从树的层序遍历中衍生出来的。BFS 相对 DFS 的最主要的区别是:dfs得将树遍历完才直到起点到终点的最小距离,而bfs不一定遍历完所有节点。所以bfs比dfs快一点,但是bfs的空间复杂度会更大。dfs是递归,得压栈,空间复杂度就是树的高度,而bfs用的队列,队列要装得下最后一层的节点,如果看成满二叉树,最后一层的节点数占总节点数的1/2,空间就更大一些。
2024-11-03 21:16:47
408
原创 【回溯方法(解决子集、组合、排列问题)】
回溯算法就是纯暴力算法,有些问题纯暴力写不出来就得用回溯方法,比如:要你在100个数中,挑50个数,如果用暴力写得用50层for循环,显然是不现实的,所以引进了回溯方法,暴力解法中的嵌套的for相当于回溯方法中的递归,可以理解为进入下一层决策树,在进入下一层决策树之前要做出选择,之后要撤销选择。抽象地说,解决一个回溯问题,实际上就是遍历一棵决策树的过程,树的每个叶子节点存放着一个合法答案。你把整棵树遍历一遍,把叶子节点上的答案都收集起来,就能得到所有的合法答案。
2024-11-03 14:44:33
1160
原创 【最长回文子串(双指针解决)java】
1.遍历原字符串,分别以下标为i为中心,i与i+1为中心来计算最长回文子串。2.怎么找最长回文子串(fun函数中实现):用双指针来向两边扩散。,有两种情况:a.中间是偶数、b.中间是奇数。
2024-10-24 20:39:42
436
原创 dfs题目:平衡二叉树(java)
}* }*///功能:求以root为根的深度return 0;//以root为根的深度=1+以root下一层的深度(较大的子树)//先求一下root左子树的深度//比较一下,选大的if(l>r){return 1+l;//函数功能:判断以root为根,判断他的左右子树是否平衡//先求root的左子树的深度//再求root的右子树的深度//比较一下是否左右子树的深度差是否>1。
2024-10-21 20:58:05
424
原创 【粉刷房子(动态规划(简单多状态dp问题))】
回归转移方程:在dp[i][0]等于在i-1位置的最小花费+costs[i][0],i-1位置不能是红色的,最小花费是min(dp[i-1][1],dp[i-1][2]),dp[i][1]和dp[i][2]和dp[i][0]类似。根据经验,看最近的位置,dp[i]是i-1位置的最小话费+i位置的花费,问题来了,i位置的花费有三种,所以一维dp表不可以,得用二维dp表,有题目可知,顺序是从0号房间到i号房间,顺序是从左往右,所以还是根据经验+题目要求。根据转移方程,现有i-1位置再有i位置,所以是从左往右。
2024-10-03 20:35:02
507
原创 【删除并获得点数(动态规划--简单多状态dp问题)】
没听懂没关系,举个例子就容易理解了,假设原数组{1,2,2,4,4,4,7,7,8},建立arr[9]的临时数组,初始化arr数组为0,遍历完原数组后arr中的值为{0,1,4,0,12,0,0,14,8},其中arr[2]表示原数组中的2相加后为4。数组是无序的,删除元素不方便,所以先变得有序,怎么变得有序?创建新的数组arr,数组的大小是原数组中的最大数+1,原数组的元素对应arr下标,然后遍历原数组,在对应的位置加加,目的是统计下标值在原数组出现的总值。具体步骤在下面链接里,在这里不再赘述。
2024-10-02 18:56:11
611
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人