自定义博客皮肤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

记录自己的成长。

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

原创 第一讲:linux 系统介绍

操作系统:是最基本、最重要的系统软件,用于管理系统资源,控制程序执行,改善人机界面,提供各种服务,合理组织计算机工作流程,为用户使用计算机提供良好的运行环境。

2021-04-17 11:20:58 51

原创 [栈]面试题 16.26. 计算器(medium)

题目:题解:本题是224:基本计算器的进阶版,加了一些优先级处理,其他不变。代码如下:class Solution {public: // 预处理空格和()里面出现首个数字为负数的情况,将"(-"替换为"(0-" void replace(string &s) { int pos=s.find(" "); while(pos!=-1){ s.replace(pos,1,"");

2021-03-10 21:22:31 103 1

原创 [栈]leetcode224:基本计算器(hard)

题目:题解:利用中缀表达式直接求值的运算法则来做,使用两个栈:符号栈和数字栈。当遍历到的字符的优先级大于>符号栈的栈顶元素的优先级时,才入栈;否则就弹出操作符,以及数字栈的两个元素,进行运算,直到符号栈的栈顶元素优先级 小于<当前操作符时,才将当前操作符入栈。当所有操作符处理完毕(即操作符栈为空时),数字栈中剩下的唯一元素为最终表达式的值。代码如下:class Solution {public: // 预处理空格和()里面出现首个数字为负数的情况,将"(-"替换

2021-03-10 21:17:36 41

原创 [二叉树]剑指 Offer 07. 重建二叉树(medium)

题目:题解:由于前序遍历和中序遍历结果都没有重复数字,所以我们根据前序遍历(根左右)和中序遍历(左根右)的特点,来划分中序数组和前序数组,然后递归处理划分后的数组即可。题解:class Solution {public: // 递归解决:前序遍历是根左右,中序遍历是左根右,我们可以根据根来分别划分 前序数组和中序数组,然后递归处理划分的数组即可 TreeNode* buildTree(vector<int>& preorder, vector<int

2021-03-06 16:08:29 39

原创 [链表]剑指 Offer 06. 从尾到头打印链表(easy)

题目:题解:按题意模拟即可。代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: vector<int> reversePrint(ListNode*

2021-03-06 15:32:02 21

原创 [模拟]剑指 Offer 05. 替换空格(easy)

题目:题解:按题意模拟即可。代码如下:class Solution {public: string replaceSpace(string s) { string res=""; for(char c:s) { if(c!=' ')res+=c; else res+="%20"; } return res; }};...

2021-03-06 15:26:59 26

原创 [数组]剑指 Offer 04. 二维数组中的查找(medium)

题目:题解:缩小领域法:利用单调性的特点,从左下角开始搜索就行了。代码如下:class Solution {public: // 题解:缩小领域法,从左下角开始搜索,按照单调性来缩小遍历范围 bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { if(matrix.empty()||matrix[0].empty())return false;

2021-03-06 15:16:52 21

原创 [hash]剑指 Offer 03. 数组中重复的数字(easy)

题目:题解:用 hashset 来存放遍历到的元素 x,若 x 在 hashset 中,则表示数字重复,则退出循环;否则将 x 添加到 hashset 中,继续遍历下一个元素。代码如下:class Solution {public: int findRepeatNumber(vector<int>& nums) { unordered_set<int> s; int res=-1; for(auto

2021-03-06 15:01:08 32

原创 [数组]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 84

原创 [前缀树]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 39

原创 [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 45

原创 [区间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 48

原创 [贪心]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 30

原创 [模拟题]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 42

原创 [多源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 46

原创 [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 20

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

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

2021-02-21 09:39:20 28

原创 [回溯]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 33 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 31

原创 [双指针]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 64

原创 [两数之和][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 24

原创 [模拟]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 27

原创 [图论]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 63

原创 [二分法]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 78 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 39

原创 [模拟题]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 61

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

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

2021-02-14 09:42:20 59

原创 [双向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 69

原创 [贪心][字符串]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 30

原创 [贪心][找规律]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 46

原创 [数组]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 60 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 33

原创 [递归]面试题 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 28 1

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

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

2021-02-02 00:01:14 56

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

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

2021-02-01 22:45:40 42

原创 [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 38

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

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

2021-02-01 16:30:38 25

原创 [前缀和]leetcode5667:你能在你最喜欢的那天吃到你最喜欢的糖果吗?(medium)

题目:题解:这道题是不难,md就是题目真tm难懂,我比赛时看到这么长的题目直接放弃了,求求能不能把题目写的简单好懂些。思路:先前缀和预处理,然后判断我们能吃到糖果的区间[d+1,c*(d+1)],和我们想吃到糖果数的区间[s[t]+1,s[t+1]],二者是否存在交集。这里解释一下[s[t]+1,s[t+1]],由于种类 t 是从下标 0 开始的,而前缀和数组 s 是从下标 1 开始的,所以我们可以吃到种类 t 的糖果可以吃的最多糖果书为 s[t+1],吃的种类 t 的最少糖果数为 s[

2021-01-31 23:47:33 31

原创 [拓扑排序][dfs]leetcode5665:从相邻元素对还原数组(medium)

题目:题解:本题最难的是将这个实际问题转换为图论问题来做,我比赛就没想到,然后等比赛结束了,看到别人的思路才知道这题原来这么简单。思路1:拓扑排序构建无向图,然后记录顶点的度(注意是总度数=入度+出度),由于起点和终点只出现了一次,所以度为1,而其他点出现的两次(度为2),而此时按题目的意思,我们每次都要选度为1的点作为起点就进行遍历,这样就转换为topsort问题了。思路二:DFS遍历无向树,这棵树是比较特别是一棵单边的无向树,所以直接dfs遍历即可,主要防止无向树向根节点回搜

2021-01-31 21:42:26 36

原创 [字符串][模拟]leetcode1780:满足三条件之一需改变的最少字符数(medium)

题目:题解:按照题目的思路,进行枚举就行了。代码如下:class Solution {public: // 让 A 中所有字符严格小于 B 中的所有字符 int work(vector<int> cntA,vector<int> cntB) { int res=INT_MAX; // 以字符i为边界,将A中A[i,'Z']的所有字符全部变成小于i的字符,将B中B['a',i-1]的所有字符变成大于i的字符

2021-01-24 17:43:23 60

空空如也

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的粉丝

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