自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

algsup

记录自己的成长。

  • 博客(29)
  • 论坛 (3)
  • 收藏
  • 关注

原创 [数组]leetcode1701:平均等待时间(medium)

题目:题解:本题是 os 里面的一个调度机制,其实就是相当于算的是 各个进程的平均周转时间。思路:直接模拟即可,用 end 表示前一个顾客运行的完成时间,若当前顾客的到达时间大于等于 end,则我们更新 end 为该顾客的最终完成时间 end=c[0]+c[1];若当前顾客的到达时间小于 end,则该位顾客的完成时间 end 为 end+c[0],然后我们的 res 加上 end-v[0] 就是周转时间了。代码如下:class Solution {public: doubl

2021-02-24 15:54:24 124

原创 [前缀树]leetcode1707:与数组中元素的最大异或值(hard)

题目:题解:本题虽为 hard 题,但就是在 [前缀树]leetcode421:数组中两个数的最大异或值(medium) 的基础上加了两个排序,没啥难点,对于queries的排序有点麻烦,不能用 map,因为重复值导致覆盖现场,所以只能用 set。代码如下:class Trie{private: Trie* next[2]={nullptr};public: Trie(){} void insert(int x) // 在前缀树中插入值x {

2021-02-24 09:45:29 84

原创 [dp][子序列问题]leetcode1771:由子序列构造的最长回文串的长度(medium)

题目:题解:考试时也想到拼接字符串,然而就是没想到怎么判断来自两个不同的字符串s1、s2,说到底还是没有彻底理解状态 dp[i][j] 以及状态转移方程。思路:连接 s1 和 s2为 s,将问题转换为[子序列问题][dp]leetcode516:最长回文子序列(medium),然后再加一个判断条件,来判断来自两个不同的字符串s1、s2。关于 dp 方程的求法以及遍历过程,可以看labudadong的讲解子序列问题通用思路|最长回文子序列。代码如下:const int N = 2

2021-02-23 11:25:38 64

原创 [区间dp]leetcode1770:执行乘法运算的最大分数(medium)

题目:题解:本题是个 区间dp 题,我本人还没有好好学过这个知识点,所以看 y总直播学习了下。等以后有时间了,再好好补这个知识点吧。思路:1)由于 w 每次只能在首尾删一个元素,可以删的最多情况是删 2m 个元素,那么当 n>=2m 时,我们可以把 num 中间的元素先删掉,因为用不到了。2)进行区间dp,状态f[i][j]表示剩余区间[i,j]的所有操作方案的集合,其值为最大分数。状态转移方程:f[i][j] = max(f[i+1][j]+w[i-1]*c[n-len],f[

2021-02-22 21:56:01 65

原创 [贪心]leetcode1764:通过连接另一个数组的子数组得到一个数组(medium)

题目:题解:贪心法,思路看代码即可。代码如下:class Solution {public: // 贪心:每次匹配 groups 中单个数组在 nums 中的最前位置 // 时间复杂度最大为O(n^2),空间复杂度O(1) bool canChoose(vector<vector<int>>& groups, vector<int>& nums) { int i=0,j=0,n=nums.s

2021-02-21 23:24:59 42

原创 [模拟题]leetcode1763:最长的美好子字符串(easy)

题目:题解:本题纯碎是个模拟题,但是考试时真的好难做啊,只能说代码还是写的太少了。思路:双重 for 暴力枚举子字符串,然后用一个 check 函数来判断每个子字符串是否满足美好字符串,是的话就根据子字符串的长度来确定是否更新 res。代码如下:class Solution {public: bool check(string cur) { int cnt[2][30]; memset(cnt,0,sizeof cnt);

2021-02-21 21:42:39 69

原创 [多源bfs]leetcode1765:地图中的最高点(medium)

题目:题解:多源 bfs 裸题,《算法竞赛进阶指南》p109 的 矩阵距离 是个模板题学习即可。代码如下:int dx[]={-1,0,1,0},dy[]={0,1,0,-1};using PII = pair<int,int>;class Solution {public: // 题解:多源bfs模板题 vector<vector<int>> highestPeak(vector<vector<int>&gt

2021-02-21 16:12:20 84

原创 [dfs]leetcode1706:球会落何处(medium)

题目:题解:本题意图很明显 dfs 即可,但是我们需要把几种递归边界思考清楚就好了,分别是:找到可行解、卡在边界、卡在中间 三种情况,剩下的看代码即可。代码如下:class Solution {public: int n,m; vector<int> findBall(vector<vector<int>>& grid) { n=grid.size(),m=grid[0].size(); vect

2021-02-21 10:09:51 31

原创 [滑动窗口]leetcode1438:绝对差不超过限制的最长连续子数组(medium)

题目:题解:滑动窗口裸题,关键点在于如何想到将 该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 转换为 利用 mutiset 的自动排序功能来计算窗口内最大值和最小值之间的差值与 limit 的关系来扩大或缩小窗口,进而更新 res。代码如下:class Solution {public: int longestSubarray(vector<int>& nums, int limit) { multiset<int&

2021-02-21 09:39:20 40

原创 [回溯]leetcode1718:构建字典序最大的可行序列(medium)

题目:看数据范围 n 最大取20,所以直接一个回溯就行了,注意这是一个带bool型的回溯,与平时写的void型的不一样,所以我们直接将 n 从大到小进行枚举,这样找到最优解之后,一路返回 ture,得到正确答案就行了。这里提供两种版本的代码,思路都是一样的,学习下码风就行。代码如下:bool visited[45];class Solution {public: vector<int> res,trace; vector<int> constr

2021-02-20 21:43:15 47 1

原创 [贪心][字符串]leetcode1717:删除子字符串的最大得分(medium)

题目:题解:考试时不会做,看题解学会的。思路:贪心法遍历字符串,优先使用 max(x,y),因为只要 x>=y,那么我们取 ab 肯定是可以的,因为我们每取一个 ab,该字符串剩余的部分就会链接在一起,那么我们又可以使用 ab 了,所以出现 ab 时,我们将统计到的 a b 的个数 -1 即可。对于该字符串我们将非 a b 的字符将字符串分成一段段的 abbaba 串,每次被截断的时候,再来更新剩余的 ab 或 ba 个数,此时的个数为 min(a,b),因为 1a 1b 就可以构

2021-02-20 19:43:57 46

原创 [双指针]leetcode1712:讲数组分成三个子数组的方案数(medium)

题目:题解:这道题考试时真不会做,只想到了前缀和,并没有想到双指针,麻了,我是废物。思路:双指针由于数组元素是非负的,所以区间和具有单调性,所以我们可以枚举两个分界点。首先我们可以先固定第二个分界点 i,来寻找第一个分界点 x 的上下界 [j,k],那么在 x 的上下界满足left<=mid;mid<=right情况下,此次的方案数为k-j+1。关于 i,j,k 的初始化讲解:i=3 表示 i 前面最少有两段,j=2 k=2 表示第一个边界从第二个点开始扩展,剩下的讲解在代

2021-02-20 12:12:49 94

原创 [两数之和][hash]leetcode1711:大餐计数(medium)

题目:题解:类比1. 两数之和,先查询补数,再插入当前数。思路:由数据范围可知两个数和的最大值为 2^21,所以我们每次查补数只需要查到 2^21 即可。a[i]+a[j] == 2^k,移项后a[j] == 2^k-a[i],所以我们每次做减法来查询 a[i] 的补数 a[j] 是否存在来更新 res,由于是从前往后遍历的,所以不会出现重解和漏解。时间复杂度O(21∗n)O(21*n)O(21∗n),空间复杂度O(n)O(n)O(n)。代码如下:const int mod =

2021-02-18 20:06:42 45

原创 [模拟]leetcode1710:卡车上的最大单元数(easy)

题目:题解:直接按重量由大到小排个序,优先选择重量重的,然后每次选择个数与剩余的个数做比较,选二者较小值,避免多选,选完之后,剩余个数还要做减法的。代码如下:class Solution {public: int maximumUnits(vector<vector<int>>& boxTypes, int truckSize) { sort(boxTypes.begin(),boxTypes.end(),[](const aut

2021-02-18 19:53:35 41

原创 [图论]leetcode1761:一个图中连通三元组的最小度数(hard)

题目:题解:读懂题目后,就是一个暴力枚举题。1)首先建立邻接矩阵,和每个顶点的度,这里计算顶点的度只要计算链接该顶点边的个数就行了。2)遍历n个顶点,看看三个顶点之间是有边相连,若有边相连,表示这三个顶点构成了一个三元组,然后计算除三个顶点连接的6边后的边数为该连通三元组的度。代码如下:int graph[410][410],indegree[410];class Solution {public: int minTrioDegree(int n, vector&

2021-02-14 23:17:19 133

原创 [二分法]leetcode1760:袋子里最少数目的球(medium)

题目:题解:本题要有二分的思想很重要,y总说过算法题都不可能是现场想出来的,一般都是见过原型,然后做出来的。本题需要转换思路:给定 maxOperations 次操作次数,能否可以使得单个袋子里球数目的最大值不超过 y。注意这里的 (x-1)/y 的 x 之所以要减1,是因为当 x 和 y 相等时,我们时需要进行分堆的。这里将一下二分法:1)若mid满足条件check,表示mid分x的话满足最大次数,我们向左逼近来寻找更小的mid,由于mid可能为目标值,我们取 r=mid。

2021-02-14 22:35:48 100 1

原创 [滑动窗口]leetcode1759:统计同构子字符串的数目(medium)

题目:题解:本题稍微推导了一下,就是一个滑动窗口裸题,直接用窗口统计连续相同字符的子字符串的长度len,然后稍微推导下同构子字符串的个数为len*(len+1)/2。代码如下:const int mod = 1e9+7;typedef long long LL;class Solution {public: // 题解:滑动窗口裸题,统计每个窗口内的连续字符相同的长度len,同构子字符串的个数为len*(len+1)/2 int countHomogenous(s

2021-02-14 20:23:12 54

原创 [模拟题]leetcode1758:生成交替二进制字符串的最少操作数(easy)

题目:题解:由于交错字符串要是"010101...",要么是"101010...",所以我们直接统计将字符串s变成前面两种就行了,我们用一个函数solve()来解决,具体思路见代码。代码如下:class Solution {public: int solve(const string& s,char c) { int cnt=0; for(auto x:s) { // 当前字符和要变成的

2021-02-14 19:50:11 162

原创 [并查集]leetcode765:情侣牵手(hard)

题目:题解:并查集的应用题,想到怎么用并查集做很关键。本题的突破口是交换次数为并查集中的每个连通分量中的组数减1,要是知道这个了,本题也就利用并查集的模板迎刃而解了。算法步骤:1)按组遍历row,同组则不要合并,不同组就进行合并,组号为id号除以2。2)统计每个连通分量的组数。3)计算交换次数,交换次数就是每个联通分量中的组数-1。代码如下:class UnionFind{private: vector<int> father

2021-02-14 09:42:20 82

原创 [双向dfs]leetcode1755:最接近目标值的子序列和(hard)

题目:题解:由于 2^40 ≈ 10^12,这样直接dfs枚举每个数组值的话肯定会超时的,所以我们将数组一分为二,分别搜索两部分来降低时间复杂度。算法步骤:1)第一次搜索:我们枚举前半段数组的所有元素选或不选得到所有状态的子序列和 sum,然后将每个 sum 存入数组 q,并对数组 q 进行排序。2)第二次搜索:尝试从后半段数组中选一些元素,找到后半段一个可行解 sum 后,然后我们二分查找数组 q,即从前半段中选一个子序列的和,然后二分找到小于等于 goal 的最大位置(sum+q[mi

2021-02-08 20:48:57 96

原创 [贪心][字符串]leetcode1754:构造字典序最大的合并字符串(medium)

题目:题解:贪心法:每次比较两个字符串的字典序,从字典序较大的字符串中选一个字符,插入res。关于贪心的证明法,可以看看y总是怎么做的。LeetCode第227场周赛20mim-30min。代码如下:class Solution {public: // 题解:贪心法 // 每次比较两个字符串的字典序,从字典序较大的字符串中选一个字符 string largestMerge(string s, string t) { int i=0,j=0;

2021-02-08 16:41:48 45

原创 [贪心][找规律]1753:移除石子的最大得分(medium)

题目:题解:贪心法,思路在代码里面。代码如下:class Solution {public: // 贪心猜想:假设a<=b<=c // 1)a+b<c,那么a+b必定可以消耗完,剩余c里面还有多余的,a+b为拿走的最多石子了 // 2)a+b>=c,那么我们每次选2个最大的进行拿走,即先消耗c和b,然后等c消耗和a差不多大时,在消耗c和a,最后柱子中只会剩下1个或0个 // a+b+c 为奇数,则最后还剩下一个;为偶数时,则最后柱

2021-02-07 22:45:20 61

原创 [数组]leetcode1752:检查数组是否经排序和轮转得到(easy)

题目:题解:不要看本题是个 easy 题,但是它的最优解法并不是那么好想的。思路1:纯暴力,按题目意思,排序、翻转,然后判断是否相等就行。时间复杂度O(n)O(n)O(n),空间复杂度O(n2)O(n^2)O(n2)思路2:扫描这个数组看看是存在是否存在多少段单调序列,若只有1个或2个单调序列,表明数组是排序好的数组经过轮转得到的,这个用脑子模拟一下就行了。若存在2个以上的单调序列,表明数组是否非排序好的数组轮转得到的。注意还要比较第一个元素和最后一个元素的大小,把它看成一个圈的话

2021-02-07 20:38:01 84 3

原创 [bfs][dfs]剑指 Offer 13. 机器人的运动范围(medium)

题目:题解:bfs dfs 纯模板题。代码如下:// 四个方向数组int dx[]={-1,0,1,0},dy[]={0,1,0,-1};// 标记数组,防止点重复访问bool visited[110][110];using PII = pair<int,int>;class Solution {public: // 题解1:dfs int movingCount_1(int m, int n, int k) { memset(v

2021-02-03 17:10:04 41

原创 [递归]面试题 04.06. 后继者(medium)

题目:题解:代码如下:class Solution {public: // 由于BST的中序遍历对应的递增数组,所以当 p->val >= root->val 时,我们需要在右子树中找后继节点 // 而当 p->val < root->val 时,我们需要在左子树中寻找后继节点 // 若能在左子树中找到后继节点,则返回后继节点,否则根节点root就是后继节点,因为这说明p的右孩子为空 TreeNode* inorderSuc

2021-02-02 21:38:54 40 1

原创 [bfs][dfs]leetcode547:省份数量(medium)

题目:题解:本题给的是一个无向图的邻接矩阵,而题目要我们求的是该无向图的联通分量数。思路1:dfs用visited数组来标记顶点是否访问访问过,然后我们枚举每个顶点,将枚举到的顶点的邻接点全部加入标记,表示为同一个联通量,直到枚举到的顶点没有邻节点,我们在枚举下一个没有被访问过的顶点。每次访问完一个联通量,将res+1。思路2:bfs与dfs思路是一样的,不过使用队列在存储并访问邻接点,直到队列为空,表示我们找到一个联通量了,将res+1。代码如下:// 用来记录顶点i

2021-02-02 00:01:14 76

原创 [并查集]leetcode721:账户合并(medium)

题目:题解:本题是并查集的实际应用题,需要把实际问题转换为我们熟悉的并查集,这点很重要,我本人现在就是很缺乏这种能力,至于怎么提升肯定需要大量做题吧。思路:1)构建并查集的模板,然后给n个客户进行并查集的初始化。2)构建一个map用来记录<邮箱,邮箱id>。对于邮箱相等的客户,我们进行id的合并;对于邮箱不同的客户,我们就用map记录。3)再构建一个map用来记录<id,邮箱列表>。我们遍历前一个map,将id在同一个联通量中的邮箱,加入邮箱列表。4)最后再遍

2021-02-01 22:45:40 65

原创 [bfs][dfs]面试题 16.19. 水域大小(medium)

题目:题解:bfs dfs 纯模板题,思路看代码即可。代码如下:// 方向数组,由于对角线也算水域范围,所以为8个方向int dx[]={-1,-1,0,1,1,1,0,-1},dy[]={0,1,1,1,0,-1,-1,-1};// 用来标记水域是否被统计过bool flag[1010][1010];class Solution {public: void dfs(vector<vector<int>>& land,int i,int

2021-02-01 17:55:29 68

原创 [两数之和][hash]888. 公平的糖果棒交换(easy)

题目:题解:类比两数之和

2021-02-01 16:30:38 33

空空如也

CSDN 最近改版真的很丑!!!

发表于 2020-04-20 最后回复 2020-04-20

_Fast的留言板

发表于 2020-01-02 最后回复 2020-01-02

csdn的个人分类的博客顺序为什么不能按时间排序了??

发表于 2019-09-01 最后回复 2019-09-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除