
Leetcode刷题
我的Doraemon
这个作者很懒,什么都没留下…
展开
-
牛客小白月赛104-D小红开锁-模拟
记录一种数组转圈遍历的简单方法原创 2024-11-08 21:19:32 · 254 阅读 · 0 评论 -
Leetcode42接雨水(单调栈)
维护一个栈,满足从栈底到栈顶元素大小递减。如果当前元素高于栈顶,且栈内有至少2个元素,则形成了一个凹槽,及一个图中横着的红色矩形,将它的面积累加即可,第一次写难在维护单调栈中计算面积和。求出前缀最大和后缀最大,用两者较小值减去当前高度,累加即可,这个思路容易想到,这里不赘述。原创 2024-08-28 22:04:30 · 531 阅读 · 0 评论 -
京东笔试0817第三题
这是一道京东笔试题目,属于动态规划中等难度题目。原创 2024-08-17 20:37:20 · 862 阅读 · 0 评论 -
快速排序-防止退化O(n2)(三路排序)
解决方案:随机化数组或者随机取基准值(而非第一个)时间复杂度会退化为O(n2)时间复杂度会退化为O(n2)所有数据都相等的数组。原创 2023-03-25 17:15:40 · 249 阅读 · 0 评论 -
Leetcode-寻找两个正序数组的中位数
明显是二分,但是二分什么呢?一般都是二分两个数组,但这道题不同,需要二分的是k,对于两个数组而言,比较两个数组的第k/2个数字,小的一方前k/2个数字都不会是中位数,可以直接排除,从而快速缩小范围。此题目是寻找两个数组组合为一个数组后的中位数,我们知道两个数组的长度,中位数是组合后的数组第几个数字我们是知道的,问题就转化为了寻找组合后数组的第k个数字,要求时间复杂度在。原创 2023-03-17 10:50:02 · 109 阅读 · 0 评论 -
牛客小白月赛67-E 游戏的买
这道题要注意一定要保证游戏能够买到。此时f[i]=0.5a+0.5f[i+1]。以此类推可以得到第一天决策的最佳期望。转载 2023-02-27 21:18:38 · 137 阅读 · 0 评论 -
牛客练习赛-C-梦迹
考虑答案是否爆int,最差情况是n*(n-1)/2,到1e10,开longlong,其次注意树状数组下标从1开始,而题目a[i]从0开始,因此加上值为1的偏移量。因此修改数字时就可以先减去修改前的贡献,加上修改后的贡献,树状数组的维护上,如果数字从a变为b,就把a位置加上-1,b位置加上1即可。这道题和用树状数组求逆序对那道题目类似,都是把数组值作为树状数组下标,效果等价于权值线段树,本质上是一道树状数组的简单题。每一个数字为答案的贡献等于getsum(W-num)原创 2023-02-19 21:07:13 · 190 阅读 · 0 评论 -
Leetcode 48. 旋转图像
如何把当前元素放到下一个即将访问的位置?如果只是简单的覆盖,下一个元素将丢失,容易想到的是用temp存储即将丢失的元素,但这样实现起来有许多细节很难写,用交换实现则特别简单,找一个临时变量,每次都把当前位置和临时变量进行交换,则实现了旋转操作。对于一圈:对于第一行(除了最后一个元素)而言,只要把这些元素旋转四次就回到了原来位置,所以只要循环四次,把中间遍历到的元素都移到下一次即将遍历的位置即可。矩阵从外到内,是一圈一圈的,只要能把一圈旋转90度,内层圈找好数据关系,for循环就可以搞定每一圈。原创 2023-01-26 17:42:19 · 123 阅读 · 0 评论 -
706. 设计哈希映射
处理冲突方法采用链表法,利用list。原创 2023-01-25 21:22:57 · 119 阅读 · 0 评论 -
56. 合并区间
双指针,先按照左端点升序排序,对于一个区间,如果可以和后面的合并,则其右端点一定大于后面区间的左端点,且合并后的区间右端点要取两个区间大的右端点,取max,注意边界即可。vector默认按照第一列的元素从小到大排序,注意如果这里加cmp函数,必须是静态函数,因为sort是全局函数,全局函数不能调用类的成员函数。原创 2023-01-25 20:23:36 · 99 阅读 · 0 评论 -
572. 另一棵树的子树
解出两颗子树的所有前序序列,若t2是t1的子树,则t2的前序序列应为t1的前序序列的子串,利用kmp算法匹配即可,代码中lNull为左子树空的标志,rNull为右子树空的标志。解法一、暴力遍历每一个子树,比较子树是否相同。官方题解给出的哈希做法,感觉很秒。时复:O(s * t)时复:O(s + t)原创 2023-01-16 17:34:26 · 95 阅读 · 0 评论 -
117. 填充每个节点的下一个右侧节点指针 II
题目有点类似于层序线索化,就是在层序遍历的基础上魔改一下,使得可以获得当前遍历到第几层的信息。还有一种简单的写法,直接得出当前层节点个数。原创 2023-01-16 16:09:43 · 105 阅读 · 0 评论 -
11. 盛最多水的容器
题目所求即为最大面积,面积=(较短边*两线段距离),答案即为max{以每一条线段作为较短边的最大面积},当较短边确定时,两线段距离越长越好,因此考虑双指针从两端向内进行移动。两指针在两端时,对于较短边而言,以此线段为较短边的最大面积就是线段长度乘以两指针位置之差,因此较短边对应的指针就可以向前或向后移动了。移动后的状态又是以上状态。因此每次较短边指针移动。原创 2023-01-13 18:32:43 · 93 阅读 · 0 评论 -
15. 三数之和
因为排过序了,如果-(nums[i]+nums[j])原创 2023-01-12 17:04:31 · 619 阅读 · 0 评论 -
LeetCode162-寻找峰值
二分找索引,对于mid,如果处于上坡,则答案在右边,如果处于下坡,答案在左边,如果处于低谷,答案任意,如果处于峰顶,即为答案。注意特判0和nums.szie()-1两个位置。原创 2023-01-09 22:24:07 · 108 阅读 · 0 评论 -
Leetcode-82 含有重复元素集合的组合
class Solution {public: vector<vector<int>> res; void dfs(vector<int>& candidates,vector<int>& ans,int sum,int pos, int &target){ ans.push_back(candidates[pos]); if(sum+candidates[pos]==target) .原创 2022-02-25 18:11:35 · 304 阅读 · 0 评论 -
Leetcode-1027最长等差数列
和最长上升子序列类似,这里多加了公差的性质,第一种想法是开一个结构体dp一维数组,dp[i].val表示以i位置结尾的最长长度,dp[i].cha表示以i位置结尾的子序列公差,你会发现无法进行状态转移,假设i<j<k,dp[k]被dp[j]更新了,并且更新后值最大,但这不代表i这个位置就一定不是最长等差序列之一,因为可能dp[i]和dp[j]只相差1甚至相同,但两者公差不一样,如果后面再来几个公差和dp[i].cha一样的,而你由没有把dp[k]给添加到序列中,这个状态没有被考虑,导致错误。.原创 2022-02-23 16:17:15 · 710 阅读 · 0 评论 -
Leetcode-80
写麻烦了,总之就是双指针,一个快指针一个慢指针class Solution {public: int removeDuplicates(vector<int>& nums) { int len=nums.size(); int cnt=1,L=1; for(int i=1;i<len;i++){ if(nums[i]==nums[i-1]){ if(cnt==2) .原创 2022-02-22 21:41:02 · 141 阅读 · 0 评论 -
Leetcode-5 最长回文子串
动态规划class Solution {public: string longestPalindrome(string s) { int st = 0, L = 1; int len = s.size(); bool dp[1100][1100]; for(int i = 0; i < len; i ++) dp[i][i] = 1; //长度为1的子串都是回文串 for(int i = 2; i <.原创 2022-02-20 13:35:51 · 283 阅读 · 0 评论 -
Leetcode-2 两数相加
考察了对链表的使用/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x),原创 2022-02-20 12:52:19 · 512 阅读 · 0 评论