
leetcode题解
1
我不会c语言
这个作者很懒,什么都没留下…
展开
-
第 53 场双周赛 5756. 两个数组最小的异或值之和
这范围一看就是显然状压,刚开始一直想状压,因为这两个数组是独立的,然后发现只需要在开一维表示选了前i个即可dp[i][nxt]=min(dp[i][nxt],dp[i-1][st]+(nums1[i] ^ nums2[k]))其中st是第二个数组的二进制状态,nxt= st | 1<<k初始化的话就是一开始所有数字赋值无穷大然后dp[i][1<<j]=nums1[i] ^ nums2[j]class Solution {public: int dp[16][1&l原创 2021-05-29 23:59:13 · 210 阅读 · 0 评论 -
5765. 跳跃游戏 VII
思路每次可以选择给定区间的步数进行跳跃,并且要求达到的点权值为0.考虑一个点能达到,那么要求这个点满足两个要求1.当前权值为02.[i-ma,i-mi]这个区间存在可以跳到的点第一个条件直接判断即可,第二个条件呢?我们可以用前缀和保存能到达的点,那么就可以O(1)算出区间中是否有可达到的点就行了赛中有想到这个,但是忘记了为啥没写这个做法…计算上一个区间的时候要注意边界class Solution {public: bool canReach(string s, int minJu原创 2021-05-23 13:48:07 · 183 阅读 · 2 评论 -
第 52 场双周赛 1862. 向下取整数对和
前言上去一眼,感觉就是傻逼题,整除分块搞一下,复杂度也就sqrt(1)+sqrt(2)+…+sqrt(1e5) (没有仔细去算这个值是多少),感觉上大分了。。然后疯狂TLE test44后面算了一下上面那个式子,复杂度大概2e7,但是因为过程中还有反复的取模操作,所以稳稳的TLE了。。思路其实可以根据素数筛法来优化这个计算过程,我们计算一个数是不是素数,其实就是枚举sqrt以内的看能不能整除,这样子复杂度自然高,而素数筛则是反过来,我去枚举因子筛掉那些能整除的数。同理,整除分块是枚举这个值,看原创 2021-05-17 16:01:55 · 199 阅读 · 0 评论 -
第 240 场周赛 5753. 有向图中最大颜色值
虽然赛中做出来了,也是一眼拓扑排序,但是转移方程部分一开始想歪了,所以简单记录一下。(要是第一次没想歪,就上大分了)思路看到有向图,加上还需要判环,所以肯定想拓扑排序1.拓扑排序判环的话,我们只需要把入度为0的点加入队列中,不断的跑图即可,如果每个点都被到达了,说明不存在环。2.那么对于要计算的答案的话,因为小写字母只有26个,所以我们维护一下每个字符在该点能出现的最大次数即可。对于从点x到点y,即更新点y时候每个字符出现的最多次数dp[y][i]=max(dp[y][i],dp[x][i]+原创 2021-05-09 12:50:39 · 156 阅读 · 0 评论 -
5695. N 次操作后的最大分数和
思路看到范围应该想到dfs或者状压。那么为什么想状压,而不是dfs呢?首先dfs的话存在大量重复的可能。就是假设你前面都删除的都一样,但是到了后面的某一次操作选了不一样的,那其实最后一部分要去计算多次而已,但是跑dfs的话,前面一样的操作会大量的进行。dp[sta]表示当前选了的数字的二进制串为st时候的最大值。那么转移也很简单,我们从sta这个二进制串中去掉任意两个,枚举上一个二进制串last那么last其实就是sta(1<<i)(1<<j)维护dp[sta]的最原创 2021-03-21 13:56:19 · 383 阅读 · 0 评论 -
5711. 有界数组中指定下标处的最大值
思路首先很容易想到,答案具有单调性。我当前index值为mid的时候,如果整个序列总和小于等于maxSum,那么当前index值小于mid的时候一定满足。那么我们就尝试增大一下mid,如果满足继续增大…根据题目条件,注意两点1.都是正整数2.相邻两个差值最多为1那么我们知道当前a[index]=mid,就是尽可能让这个位置为最值点,其他位置尽量小。我们去计算左边部分,左边可以放index+1个数字(包括第index这个位置)那么其实就是往左边一直递减放就可以了。如果减到了1,因为要为正整原创 2021-03-21 12:45:52 · 125 阅读 · 0 评论 -
72.编辑距离
很经典的题。就是说给你两个字符串a和b,你可以对a或者b进行操作,每次操作可以增加、删除、或者修改一个字符。问最少操作多少次,可以让字符串a等于字符串b思路:对A增加 = 对B删除对A删除 = 对B增加修改A = 修改 B所以其实等价三种操作对A增加,对B增加,修改A我们定义dp[i][j]表示字符串a的前i个字符和字符串b的前j个字符的最小编辑距离那么其实,dp[i][j]可以由三种状态转移过来,也就是对应上面的三种操作dp[i][j]=dp[i-1][j]+1即表示a串的最后一个原创 2021-03-08 15:23:05 · 361 阅读 · 1 评论 -
leetcode 环形链表Ⅰ 和 环形链表Ⅱ
我们可以通过双指针做这题。快指针每次走两步,慢指针走一步考虑一下,如果由环,那么两个指针最后是在环上面的。那么因为快指针每次都比慢指针多走一步。所以距离每次会减少一,一定会相遇。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */clas.原创 2021-02-28 18:51:25 · 130 阅读 · 0 评论 -
5687. 执行乘法运算的最大分数
思路:这种选择的方式当然是dp来做啦dp[l][r]表示左边选了l个数字,右边选了r个数字的最大得分转移方程:dp[l][r]=max(dp[l-1][r] + mut[idx] * nums[l-1] ,dp[l][r-1] + mul[idx] * nums[n-r])其中idx=l+r-1方程应该比较好想到的,就是我要达到当前状态选左边的还是要选右边的才能最大,idx就是当前选了多少个,因为下标从0开始所以要减去1。class Solution {public: int max原创 2021-02-21 22:41:09 · 132 阅读 · 3 评论 -
5670. 互质树
思路首先容易发现num[i] 仅仅只有50.又因为树是一颗有层次的结构,当前节点的祖先节点,也就是从祖先结点一直到当前结点。而且要最近的。那么其实我们只需要更新路径上的值的拥有者即可。ok[i]=x 表示结点x的num[x]=i我们进行bfs,每次下传一个vector 保存了1到50的数值的拥有者。因为要离得最近的,我们这样子只是存了这个数值最近是谁的。可能当前数值和很多祖先互质。所以我们还需要用dep维护一个深度。儿子结点的深度等于当前结点深度+1代码class Solution {p原创 2021-02-21 00:17:27 · 264 阅读 · 0 评论 -
二叉树前序、中序、后序遍历递归与非递归版本、层序遍历
文章目录二叉树的层序遍历二叉树的前序遍历递归非递归二叉树的后序遍历递归非递归二叉树的中序遍历递归非递归二叉树的层序遍历思路:层序遍历采用队列即可。每次操作就是进行一层的遍历,将当前一层的值存进vector,并且如果当前节点的左右节点不为空,就丢进队列。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;原创 2021-02-11 14:03:45 · 222 阅读 · 2 评论 -
1755. 最接近目标值的子序列和
思路:看到n是40,很容易想到复杂度是指数阶的。但是直接暴力枚举的话,2^40肯定TLE。那么很容易想到我们分开两部分 一部分各20个算出来所有组合情况。处理完所有组合情况后,我们对左半部分从小到大排序,对右半部分从大到小排序。这样子我们可以利用双指针计算出来答案。左半部分我当前指向了这个部分的最小值。右半部分我当前指向了这个部分的最大值。计算出来的x和goal去比较,如果x>goal,那么我们要去减少x,那么其实就只能移动右半部分的指针,因为右半部分才能减小。如果x<goal,原创 2021-02-08 19:14:33 · 137 阅读 · 0 评论 -
5666. 回文串分割 IV
思路:其实就是枚举第二个回文串的起点和终点,这样子,三个回文串的起点和终点都有了。只要三个区间都是回文即可。那么我们考虑如何判断一个区间是不是回文串呢?做法有很多,这里n只有2000所以允许n^2的做法 我们可以枚举回文中点去左右拓展,也可以去区间dp这里介绍的是区间dp。dp[i][j]表示第i个字符到第j个字符之间是不是回文串 是的话就为1,不是就为0l==r 显然dp[l][r]=1l+1==r dp[l][r]= s[l] == s[r]其他 即r-l+1>=3 dp[l][r]原创 2021-01-31 13:26:11 · 157 阅读 · 0 评论 -
leetcode 第225场周赛 题解
替换隐藏数字得到的最晚时间思路:直接暴力判断赋值即可。class Solution {public: string maximumTime(string t) { if(t[0]=='?' && t[1]=='?') t[0]='2',t[1]='3'; else if(t[0]=='?'){ if(t[1]>='4') t[0]='1'; else t[0]='2'; }原创 2021-01-24 21:40:24 · 485 阅读 · 1 评论 -
leetcode 第44场双周赛 题解
找到最高海拔思路:前缀和一下,恢复原来的序列,然后维护个max即可class Solution {public: int largestAltitude(vector<int>& gain) { int ma=0,now=0; for(auto &x:gain){ now+=x; ma=max(ma,now); } return ma; }};原创 2021-01-24 17:07:25 · 175 阅读 · 1 评论 -
leetcode 第222场周赛 题解
卡车上的最大单元数思路:贪心按照能装载的单元数量从大到小排直接选即可class Solution {public: int maximumUnits(vector<vector<int>>& b, int t) { sort(b.begin(),b.end(),[](vector<int> a,vector<int> b){ return a[1]>b[1];原创 2021-01-03 22:18:05 · 121 阅读 · 0 评论 -
leetcode 第40场双周赛 题解
最大重复子字符串思路:计算一下长度比值,然后从大到小枚举,用c++的find函数即可class Solution {public: int maxRepeating(string a, string b) { int ma=a.size()/b.size(); for(int i=ma;i;i--){ string z=""; for(int j=1;j<=i;j++) z+=b; i原创 2020-11-28 23:52:41 · 219 阅读 · 0 评论