leetcode
文章平均质量分 54
dezhonger
这个作者很懒,什么都没留下…
展开
-
数组模拟几种队列的写法
1、普通队列队列数组名为q[N]初始化hh = 0, tt = -1, 队列的元素区间为[hh, tt]入队:q[++tt] = val;出队: hh++队头元素: q[hh]判空: hh <= tt 表示非空, hh > tt 队列为空2、循环队列(下列所有加减法都是在mod(N+1)的意义下)队列数组名q[N + 1], 循环队列最多存储N个元素,是为了区分队空和队满的情况初始化hh = tt = 0, 队列的元素区间为[hh, tt),这里右侧为开.原创 2021-05-26 00:49:37 · 195 阅读 · 0 评论 -
Leetcode设计数据结构O(1)数据结构
LRU:struct Node { Node *l, *r; int key, val; Node(int _key, int _val) :key(_key), val(_val) {}}*head, *tail; //两个哨兵class LRUCache {public: int n; unordered_map<int, Node*> hash; //从双链表删除掉p节点 void remove(Node* p) {原创 2021-05-25 01:36:15 · 237 阅读 · 0 评论 -
树的迭代遍历问题
94. 二叉树的中序遍历/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<int>原创 2021-05-25 01:24:39 · 85 阅读 · 0 评论 -
Leetcode一类区间问题总结
56、区间合并https://leetcode-cn.com/problems/merge-intervals/先按照左端点排序,左端点相同按照右端点排序,依次合并区间即可。class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { typedef pair<int, int> PII;原创 2021-05-24 23:45:39 · 275 阅读 · 1 评论 -
Leetcode hard一句话题解
代码:https://github.com/dezhonger/LeetCode99.Recover Binary Search TreeMorris-traversal算法218: The Skyline Problem 扫描线算法原创 2021-03-30 23:07:13 · 147 阅读 · 0 评论 -
Leetcode1444
每次沿着水平或者垂直切一刀,将左边或上边的分给别人,剩余的保留,要求每次切出的必须包含至少一个字母'A',最后剩余的也必须包含字母'A',求有多少种切法思路:由于每次保留的都是右下角的那一块,我们设计这样的dp状态dp[i][j][k]表示剩余的左上角坐标是(i, j)当前共有k块的方法数状态转移是每次从水平切一刀,或者垂直切一刀。两块都必须包含字母'A',这个可以用二维前缀和来做 final int mod = 10_0000_0007; int[][...原创 2020-05-18 23:54:11 · 168 阅读 · 0 评论 -
Leetcode 629
题意题目链接从111到NNN一共NNN个数组成的一个数组,求逆序对为mmm的方法数有多少个思路动态规划定义dp[i][j]dp[i][j]dp[i][j]表示前iii个数(也就是111到iii)组成的数组中逆序对为jjj的方法数,考虑把数字i+1i+1i+1放置在数组的最前面,那么会增加iii个逆序对;如果放在第一个数之后,会增加i−1i-1i−1个逆序对,以此类推,如果放置在最后,那么...原创 2020-04-26 00:27:00 · 238 阅读 · 0 评论 -
Leetcode1157
题意题目链接给了一个数组,有多组询问,每次问在区间[l,r]内出现最多次数的数,次数是否>=threshold的给了一个数组,有多组询问,每次问在区间[l, r]内出现最多次数的数,次数是否>=threshold的给了一个数组,有多组询问,每次问在区间[l,r]内出现最多次数的数,次数是否>=threshold的数组长度<=2∗104数组长度 <= 2 * 10...原创 2020-04-20 23:49:59 · 192 阅读 · 0 评论 -
Leetcode 761
题意:一个01字符串是special binary当前仅当1、0和1的个数相同2、任何一个前缀里的1的字符的个数都不少于0的字符的个数可以进行下面的操作:从字符串S中选择两个相邻的special binary,交换它们进行若干次后,问能得到最大字符串是什么?题解:首先转换题目把1当做左括号,0当做右括号,那么special binary的意思就是说这个字...原创 2020-04-10 00:58:11 · 150 阅读 · 0 评论 -
Leetcode 517
题意一共n台洗衣机,每台洗衣机有a[i]台衣服,每次可以选择m台洗衣机向相邻的洗衣机传递一件衣服,问让所有洗衣机都有相同的衣服数量需要至少多少次操作?题解:感觉这个题目还是比较难想的,还是看了别人的博客的才会做的首先判断不可能的情况我们考虑任意一台洗衣机i(从0开始计算),考虑为了让最后全部洗衣机都有相同的衣服,需要通过i传递的衣服有多少,我们计算在i左边的衣服总数前缀和pref...原创 2020-03-14 22:15:36 · 169 阅读 · 0 评论 -
Leetcode 446
给了一个数组,求等差数列有多少个,要求等差数列的长度至少为3. 比如:Input: [2, 4, 6, 8, 10]Output: 7Explanation:All arithmetic subsequence slices are:[2,4,6][4,6,8][6,8,10][2,4,6,8][4,6,8,10][2,4,6,8,10][2,6,10]数组长度N...原创 2020-03-01 16:21:30 · 194 阅读 · 0 评论 -
Leetcode 891
给一个数组,求这个数组的所有子序列(可以不连续)的最大值和最小值的差的和如果考虑所有的子序列显然是N^2的数量级,还要求出来最大值和最小值,那么复杂度高达O(N^3)其实我们可以单独考虑每个值对答案的贡献当A[i]作为最大值的值时候对答案的贡献为A[i]当A[i]作为最小值的值时候对答案的贡献为-A[i]因此我们可以对数组先排个序(因为是子序列,数组元素的位置...原创 2020-02-29 20:23:59 · 172 阅读 · 0 评论 -
Leetcode 668, 719
668 找到乘法表里的第k小的树显然是用二分,不过这个题目不是二分m和n的位置,而是二分候选答案,我们知道候选的是在1和m*n之间,对于每个值,我们可以在O(min(m, n))的时间内求出来有多少数比它小时间复杂度是O(min(m, n)*log(m*n)) public int findKthNumber(int m, int n, int k) { ...原创 2020-02-29 17:39:17 · 172 阅读 · 0 评论 -
Leetcode 862
找到最短的连续子数组的和至少为k维护前缀和b,那么要我们要找的就是满足b[i] - b[j] >=k 的最大的j是多少,朴素的实现的话复杂度是O(N^2)的注意到如果前缀和b[x] >= b[y]的话,那么x永远不可能成为解,因为这个时候如果x满足 b[i] - b[x] >= k的话,那么j也一定满足b[i] - b[y] >= k,并且y和i组成的数组...原创 2020-02-29 16:43:14 · 274 阅读 · 0 评论 -
Leetcode 992
求连续子数组的不同个数是k的有多少个这个题目也是滑动窗口的思想,但是我们直接统计等于k的不太好统计。可以先统计不同数字个数 <=k的子数组有多少个,我们记录为count(A, K)那么答案为count(A, K) - count(A, K - 1)求count(A, K)的话,就使用普通的滑动窗口的思想来处理就可以了 public int subarr...原创 2020-02-29 15:30:58 · 173 阅读 · 0 评论 -
Leetcode 828
定义个函数 countUniqueChars(s) 为s中仅仅出现一次的字母的个数给一个字符串,求这个字符串所有的子串的countUniqueChars之和。len <= 1e5暴力枚举不可行。这个题目想了好久,想了滑动窗口,想了dp计数,发现要么行不通,要么看错了题。其实这个题反过来考虑,每个字母对结果的贡献,就可以解决了。考虑一个字母什么时...原创 2020-02-23 17:18:22 · 207 阅读 · 0 评论 -
Leetcode1095
一个先严格上升后严格下降的数组,给出最小的index使arr[index] = target我们可以先找到山峰的位置,然后分别在左边和右边进行二分搜索。刚开始我认为找山峰无法用二分来做,就直接上三分找山峰了。。发现自己太蠢了。。三分法:public class Leetcode1095 { int len; MountainArray arr;...原创 2020-02-23 16:09:16 · 301 阅读 · 0 评论 -
Leetcode 85
求最大的全是1的矩形我们逐行考虑,可以将问题转换为求一个柱形图的最大面积。比如对于题目的例子:[ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"]]就是把每一行的数字加上上一行的第一行转化为:[1,0,1,0,0]第二...原创 2020-02-23 15:28:15 · 123 阅读 · 0 评论 -
Leetcode weekly contest176 1351-1354
1、每行每列的数都是都是递减的,求负数有多少个O(M+N): public int countNegatives(int[][] grid) { int m = grid.length; int n = grid[0].length; int x = m - 1; int y = 0; int r...原创 2020-02-16 20:18:54 · 127 阅读 · 0 评论 -
Leetcode 1040
题意:给了一行石头的坐标,每次可以把一个端点(最左/最右)的石头移动到一个非端点的位置,求最后这n个石头连续的最少和最多移动次数看代码吧,注释还是比较详细的。 public int[] numMovesStonesII(int[] stones) { Arrays.sort(stones); int n = stones.length...原创 2020-02-15 22:09:11 · 349 阅读 · 0 评论 -
Leetcode 632
给定k个递增的列表找到最短的区间包含这k个列表里每个列表至少一个数贪心地去想,显然这k个数相邻越近,数字越小。那么我们首先拿k个列表最小数,看看答案是多少(最大值-最小值就是答案),然后把最小那个数逐次增大,比如这个数是第一个列表第一个数,那么就替换第一个列表第二个数,然后判答案是否更优,依次比下去。实现的话可以采用heap维护一个大小为k的堆来做 public...原创 2020-02-12 03:03:03 · 197 阅读 · 0 评论 -
Leetcode837
参考了:https://zhuanlan.zhihu.com/p/86167813题意:初始是0点,每次可以从[1, W]中随机出一个数字,累加上去,直到自己的点数 > K, 求这个时候点数 <= N的概率我们使用动态规划来做:dp[i]表示我们达到点数为i的概率,注意到当 i >= K + W的时候 , dp[i] = 0,考虑dp[i]怎么求,点...原创 2020-02-09 19:52:43 · 418 阅读 · 0 评论 -
Leetcode 393
判断给定的字符序列是不是一个有效的UTF-8编码这个题目看懂题目就很简单的,首先要知道UTF-8是个不定长的编码,也就是说每个字符的长度可能是1-4个字节,具体是怎么表示的呢?第一个字节如果第一位0,那么它自己表示一个字符如果前三位是110,那么表示当前字节和接下来的一个字节一起表示一个字符,并且后面的字节前两位都是10如果前四位是1110,那么表示当前字节和接下来的两个字节...原创 2020-02-08 23:49:21 · 191 阅读 · 0 评论 -
Leetcode 649
R和D轮着投票,每一次每个人可以选择一个对方的人让他没有投票权,都选最优策略的时候谁能胜利稍微思考可以发现:RD R winDR D win也就是说下标小的时候占优势我开始以为谁多谁就胜利,其实不是的,比如DDRRR,这个是时候Dwin,因为第一轮过后 会变为什么呢?DDR?其实不是的,可以这样决策,第一个D和第二个D分别让第三个R和第四个R失去权力,然后最...原创 2020-02-08 22:30:49 · 204 阅读 · 0 评论 -
Leetcode808
有两个瓶子A和B分别有N毫升水,每次可以进行下面四种操作之一Serve100 ml of soup A and 0 ml of soup B Serve75 ml of soup A and 25ml of soup B Serve 50 ml of soup A and 50 ml of soup B Serve 25ml of soup A and 75ml of so...原创 2020-02-08 20:57:08 · 160 阅读 · 0 评论 -
Leetcode787
问从s到t最多k+1条边的最小值,不存在返回-1图论题,不会做,感觉比较难理解,应该算是dijkstra算法的应用讲解dijkstra算法:https://www.luogu.com.cn/blog/ztyluogucpp/qian-tan-dijkstra我来解释一下高票里的解法维护一个优先队列,节点内容是到达某个节点用了stop条边的最小值,优先队列按照边权升...原创 2020-02-08 20:19:48 · 328 阅读 · 0 评论 -
Leetcode 395
这个题的枚举方式我没想到。可以通过枚举子串中不同字母的数量,一共26个字母,复杂度是哦O(26N)也就是说枚举字符串中不同字母有1个的最大结果,然后枚举有两个不同字母的滑动窗口应该也是可解的。public class Leetcode0395 { public static void main(String[] args) { S...原创 2020-02-08 18:12:18 · 387 阅读 · 0 评论 -
Leetcode1223
给出每个点数不能连续出现的次数,求可能的方法数动态规划:dp(i, j, k)表示掷第i骰子的时候,是j点,并且j连续出现k次的方法数,dp(i, j, k) = dp(i - 1, j, k - 1) k > 1dp(i, j, k) = sum(dp(i - 1, j', x)), k =1, j != j', x是任意值第二个递推式编码的时候注意维...原创 2020-02-05 22:35:33 · 109 阅读 · 0 评论 -
Leetcode1227
n个乘客坐飞机,第一个乘客的票丢了,因此他会随便坐一个位置但是从第2个乘客开始,按照下面的规则来坐座位:- 如果他自己的座位没人坐,他就坐自己的座位- 否则,随机选择一个座位。求第n个人坐在自己位置上的概率考虑第一个人的情况:- 如果他坐第一个位置,概率为1/n,那么后面的人每个人都会正确地坐在自己的位置,概率为1- 如果他坐最后一个位置,概率为1/n, 那么第n...原创 2020-02-05 22:11:57 · 318 阅读 · 0 评论 -
Leetcode1247
只有对应位置是xy或者yx的时候需要考虑交换记第一种类型的个数为t1, 第二种为t2xxxxyyyy我们可以交换两次得到yyxxyyxx第二种类型的同理,如果两种类型的个数都是奇数的话会多出来一个xyyx需要再交换两次,如果一个奇数一个偶数,那么无解。 public int minimumSwap(S...原创 2020-01-29 23:08:00 · 408 阅读 · 0 评论 -
Leetcode777
给出两个字符串start和end,只有'L'、'R' 、'X'三种字符,可以对start字符串进行两种操作XL -> LXRX -> XR问是否可以把start变为endsol:注意到1、去除掉所有的x后,start和end应该是相同的。2、在遍历两个字符串的时候,因为我们只能对start操作,所以出现start中L对应的索引要比end中对应的L...原创 2020-01-29 18:48:51 · 144 阅读 · 0 评论 -
Leetcode 398 蓄水池抽样算法
https://www.cnblogs.com/MrLJC/p/4113276.html原创 2020-01-29 03:41:17 · 128 阅读 · 0 评论 -
Leetcode 801
给出两个数组,可以交换对应位置的数,问最少交换几次可以让两个数字都递增 ,题目保证存在有解。sol:dp解决,f[i]表示不交换第i位使前i位递增的最少交换次数,g[i]表示交换第i位使前i位递增的最少交换次数 public int minSwap(int[] A, int[] B) { //f[i] 不交换第i位的最小交换次数 //...原创 2020-01-29 03:11:23 · 182 阅读 · 0 评论 -
Leetcode858
一个正方形,左下角会放出射线,其他三个角分别有一个接收器,给出发射的角度的正切值,问这个射线最终会被几号接收器接受?思路:初看此题,没有比较好的思路,暴力计算射线也显得非常麻烦,不妨我们把射线反射转换一下,变为扩展这个正方形。图我就不画了,可以参见这里https://www.cnblogs.com/grandyang/p/10646040.html这里的解释我开始...原创 2020-01-29 01:27:58 · 116 阅读 · 0 评论 -
Leetcode838
一行多米诺骨牌,给定每个牌往左倒或者往右倒,求最后每个骨牌的倒下方向。思路:注意到一个骨牌的最终方向取决于它左边和它右边骨牌的方向,具体而言,以下情况:如果两边都是同一方向,那么中间的骨牌也会倒向这个方向L...L: LLLLLR...R: RRRRR如果是在L和R之间,那么中间的骨牌不会受到外力,依然保持平航L...R: 结果为L...R, 中间三个是平...原创 2020-01-29 00:46:18 · 209 阅读 · 0 评论 -
Leetcode 855
一行N个位置,两种操作。seat: 每次每个同学坐在一个位置,要满足尽量离最近的同学最远,leave(i), 第i个位置的人起来,保证第i的位置是有人的sol:将相邻的两个人化为一个区间,那么每次seat的位置,就是最远的区间的中点。需要处理边界问题,我们可以虚拟出-1和N两个点,初始化的时候插入(-1, N)这个区间,注意怎么计算区间的distance的。至于怎么...原创 2020-01-28 00:05:03 · 201 阅读 · 0 评论 -
Leetcode 948
可以话费power得到point,可以用point来得到一个token的power。问可以选取到的最大point一个显然的策略是:用小的power得到point,再用point取换取大的power,这样就可以买到更多的point的,具体实现可以使用双指针。 public int bagOfTokensScore(int[] tokens, int P) { ...原创 2020-01-26 02:17:28 · 187 阅读 · 1 评论 -
Leetcode450
删除BST中的一个节点,我起初写了非常复杂的版本,考虑了很多种情况。还错了很多次。。直接看大佬的代码吧 public TreeNode deleteNode(TreeNode root, int key) { if (root == null) return null; if (key > root.val) root.right = dele...原创 2020-01-25 21:21:24 · 211 阅读 · 0 评论 -
Leetcode528
前缀和&二分查找实现为了方便,数组多开了1位,因此返回的下标也要减去1 int[] s; int sum = 0; Random random; public Solution(int[] w) { s = new int[w.length + 1]; for (int i = 0; i < w.length; ...原创 2020-01-25 20:13:48 · 256 阅读 · 0 评论 -
Leetcode1145
给一颗二叉树,a选x节点染为红色,问b是否可以选一个节点y染成蓝色,使得按照一定的规则下b win。规则:每个选手每次可以选择一个已染色的邻居节点染成自己的颜色,如果没有这样的节点,就跳过这一回合。最后谁的节点多,谁赢。 节点数为奇数。sol:给定了x节点,那么为了最大化b能染得节点数,我们只需要考虑三个节点,x的父节点和x的两个子节点。 int p, l, ...原创 2020-01-25 19:59:15 · 155 阅读 · 0 评论