自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

转载 typedef 以及 typename 的作用

在学习STL的过程当中,经常会遇到一些让人难以理解的C++代码,比如:typedef typename std::vector<T>::size_type size_type;看起来它应该是定义一个类型别名,但是typedef使用方式应该是typedef + 原类型名 + 新类型名(typedef具体使用方法可移步 typedef和#define的用法与区别 ),为何此处多了个typename?typename又是什么东西?typedef char* PCHAR;只记得泛型编程(GP

2021-02-28 21:42:54 532

原创 力扣精选top面试题---------二叉树的最大深度

题目链接思路:这道题很简单,dfs即可。代码:在这里插入代码片/** * 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.

2021-02-24 17:12:20 68

原创 力扣精选top面试题---------最小覆盖子串

题目链接思路:这道题要好好学习,用到的算法就是滑动窗口,首先要先把题意看懂,转为我们的代码来说,就是窗口内的元素必须包含给定的t字符串(包括重复的字母)。读完题意之后,就可以开始读代码了。代码:class Solution {public: string minWindow(string s, string t) { int left = 0, right = 0, start = 0, minLen = INT_MAX; unordered_map&lt.

2021-02-24 17:05:50 71 1

原创 力扣精选top面试题--------二叉树的层序遍历

题目链接思路:这道题就是bfs模板题,通过使用一个链表(我自己用到了deque,其实不用的)来记录遍历过的某层的节点即可,剩下的就是很典型的bfs套路。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), r.

2021-02-24 16:54:10 80

原创 力扣精选top面试题--------对称二叉树

对称二叉树思路:这道题依旧是二叉树的遍历题,几乎所有的二叉树题本质上都是遍历,在遍历的基础上进行修改代码即可。具体步骤可看代码,不再讲述。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(null.

2021-02-24 16:20:31 65

原创 力扣精选top面试题--------验证二叉搜索树

题目链接思路:这道题主要是运用中序遍历即可,当然跟上题讲述的那样,有好几种遍历方式,这里只写了递归版本,其实还可以写非递归版本。用一个变量prev来保存上次访问的值,然后通过比较条件,判断一下即可。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val.

2021-02-24 16:07:53 80

原创 力扣精选top面试题-------- 二叉树的遍历

题目链接思路:这道题其实是模板题,必须好好掌握二叉树的遍历方式,我这边了解到的共有三种:递归,非递归,Morries算法,这些知识后面我会总结起来,现在这里就用递归算法来解决。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), l.

2021-02-24 08:33:03 91

原创 力扣精选top面试题--------解码方法

题目链接思路:转载此处!代码:class Solution {public: int numDecodings(string s) { if (s[0] == '0') return 0; vector<int> dp(s.size()+1); dp[0]=1;dp[1]=1; for (int i =1; i < s.size(); i++) { if (s[i] == '0').

2021-02-24 08:23:52 74

原创 力扣精选top面试题--------合并两个有序数组

思路:这道题我们先从尾巴上进行处理,把两个数组最大的值放置在目的数组的后面,最后再来考虑某个源数组是否有剩余,有的话再放置在目的数组即可。代码:class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { while(m && n){ int flag = 0; .

2021-02-22 22:49:21 68

原创 力扣精选top面试题--------柱状图中最大的矩形

题目链接思路:这道题运用的算法是单调栈,先对每个元素进行左右两边查找小于该元素的值的下标,用两个容器进行存储找到的下标,方便后面直接运用,通过右 — 左得到的是宽度,再乘以该元素即可(因为该元素就是高)。代码:class Solution {public: stack<int> left; stack<int> right; vector<int> q; int largestRectangleAre..

2021-02-22 16:38:54 91

原创 力扣精选top面试题--------单词搜索

题目链接思路:这道题是典型的迷宫dfs题,通过循环遍历每一个节点,看是否能完成题意即可,具体应该看看代码好好学习一下dfs套路。代码:class Solution {public: int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; bool exist(vector<vector<char>>& board, string word) { int n = board.size(); int.

2021-02-22 16:22:57 60

原创 力扣精选top面试题--------颜色分类

思路:这道题我们可以用双指针来做,无非就是拿两个变量来头尾推进,具体可看代码,很好理解。代码:class Solution { public: /* 荷兰三色旗问题解 */ void sortColors(vector<int>& nums) { int a,b,c; a = b = 0; c = nums.size()-1; while(a<=c){ if(nums[a]==0){ //如果是0,就要和.

2021-02-22 15:52:39 57

原创 力扣精选top面试题-------子集

思路:这道题,我是用全排列的做法来做的,通过设置数组的位数来控制输出的数量即可,代码较为简单,容易理解。代码:class Solution {public: vector<vector<int> > q; int n; void dfs(vector<int>& nums,int step,int sum,vector<int>& p){ if(p.size()==sum){ .

2021-02-22 15:52:08 76

原创 力扣精选top面试题--------矩阵置零

思路:这道题我们就按照以下步骤走即可:首先要记录下第一行和第一列是否全部为零(就是第一行第一列内是否有零,最后再进行处理)遍历除第一行第一列以外的数据,如果有修改第一行第一列对应位置为零根据第一行第一列修改matrix修改第一行第一列代码:class Solution {public: void setZeroes(vector<vector<int>>& matrix) { if (matrix.size() == 0) ret.

2021-02-22 15:51:08 86

原创 同步与异步,阻塞与非阻塞

同步异步定义:同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)。所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回. 但是一旦调用返回,就得到返回值了; 换句话说,就是由调用者主动等待这个调用的结果;异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果; 换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果; 而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回

2021-02-22 09:10:35 155

原创 力扣精选top面试题-------爬楼梯(斐波那契)

思路:这道题有两种做法,一是斐波那契,二是动态规划。代码:class Solution {public: int climbStairs(int n) { int a=1,b=1; int num = 0; if(n==1) return 1; else{ for(int i=1;i<n;++i){ num = a+b; a = b.

2021-02-21 15:55:32 139

原创 C++中vector二维的初始化

初始化二维vector,为r*c的vector,所有值为0.直接用初始化方法vector<vector > newOne(r, vector(c, 0));用resize()来控制大小 vector<vector<int> > res; res.resize(r);//r行 for (int k = 0; k < r; ++k){ res[k].resize(c);//每行为c

2021-02-21 15:32:35 1218

原创 力扣精选top面试题-------x 的平方根

思路:这道题也是一道经典题,用二分法来做即可,也就是二分寻找答案。代码:class Solution {public: int mySqrt(int x) { long long l,r,mid; l = 0,r = x; while(l<r) { mid = l + r + 1 >>1; if(mid<=x/mid) {.

2021-02-21 15:30:01 78

原创 力扣精选top面试题-------不同路径

题目链接思路:这道题我们可以用动态规划来做,如图:当然还有另外一种更快的做法,那就是排列组合的方法来做,具体看图:代码1:class Solution {public: int uniquePaths(int m, int n) { vector<vector<int> > q(m,vector<int>(n,0)); for(int i=0;i<m;++i){ q[i][0] = .

2021-02-21 15:19:53 79

原创 力扣精选top面试题--------加一

思路:这道题是道基础题,比大数加法要简单的多,我们只需要从尾巴来时遍历,用一个变量来记录是否要进位即可,如果说某一位上是9,那么肯定是要进位的;最后我们还要判断这个变量是不是1,是的话还要在头上插入1。代码:class Solution {public: vector<int> plusOne(vector<int>& digits) { int j=0; for(auto it=digits.end()-1;it>=d.

2021-02-21 11:22:09 87

原创 力扣精选top面试题-------合并区间

思路:这道题也是一道经典题,合并区间。首先我们先要排序,就按照默认排序即可,根据第一元素从小到大排,相同的看第二个元素即可;这里很明显要维两个变量(一个区间表示的范围),然后我们就用这个一直去遍历剩下来的元素,当发现某个区间超过了维护的区间,此时就可以把该维护的区间放入容器,更新区间即可。代码:class Solution {public: vector<vector<int>> merge(vector<vector<int>&g.

2021-02-21 11:11:10 98

原创 力扣精选top面试题--------跳跃游戏

思路:这道题的话,比较巧的思路:如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示跳越后的点的左边所有都可以到达。可以对每一个点进行遍历,把 能跳到最远的距离 k 不断更新。如果遍历到某个 i 下标,但是我的 k 是比这个下标小的话,就代表我不能到达这个坐标 。(代码2是代码1的改进版)代码1:class Solution {public: bool canJump(vector<int>& nums) { int n=nums.s.

2021-02-21 09:27:28 170

原创 力扣精选top面试题--------螺旋矩阵

思路:这道题算是简单编程题,我们可以设置四个变量,表示上下左右的边界,当我们while循环内的时候,通过比较这四个变量来跳出循环,具体看代码。代码:class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if(matrix.size()==0) return {}; int l=0,r=matrix[0].siz.

2021-02-21 08:58:35 77

原创 力扣精选top面试题--------最大子序和

思路:这道题也是经典题,连续子数组的最大值,就用一个变量既可以,通过for循环遍历,当num<0时,即把当前值赋值给num,为什么呢?自己想,如果当前num都是负数,不管后面的元素加起来是正数还是负数,都比加上当前的num都小,那么何不为把此时的num取代呢?代码:class Solution {public: int maxSubArray(vector<int>& nums) { int ans=-9999999,num = 0; .

2021-02-21 00:15:59 79

原创 力扣精选top面试题--------Pow(x, n)

思路:这道题要注意的点就是指数是负数的时候,这里当出现指数为负数的时候,我们是把x变为1/x来做的,但是要考虑负数是否取到最小值,因为最小值取反是超过int的最大值的,处理也很简单,我们只需要先把x的一次方提取出来,这样就不会存在越值得问题,具体看代码即可。代码:class Solution {public: double myPow(double x, int n) { // 特殊情况处理 if(n == 0) return 1; if(x.

2021-02-21 00:07:31 85

原创 Go语言中导致程序崩溃

前言:在Go语言中,如果我们go一个协程,但这个协程出现了panic,我们没有捕获这个协程,就会造成程序的崩溃,也就是整个程序终止;但是如果这时可以在goroutine中使用recover来捕获panic,进行处理,这样主协程以及其他协程不会受到影响。代码:package mainimport ( "fmt" "time")func printer() { for i := 0; i < 10; i++ { time.Sleep(time.Second) fmt.Pri

2021-02-20 23:57:19 1570 1

原创 力扣精选top面试题-------字母异位词分组

题目链接思路:这道题先把题意读懂后,我们可以利用一个map来解决问题,只不过这个map的key为string,而value则是vector< string >,我们的思路就是for循环遍历,把每个字符拿出来进行sort后,把它放进map对应key中的vector< string >中,这样我们就可以把所有排序后的字符串放置在一个容器里,最后我们再次遍历map容器即可。代码:class Solution { map<string, vector<strin.

2021-02-20 11:41:07 55

原创 力扣精选top面试题-------旋转图像

思路:这道题有多种解法,我们可以先把整个数组进行水平翻转,得到如下图:然后再把这个数组进行对角线翻转,此时如果你是以左斜对角线为主的话就会得到向右旋转90度;如果是以右斜对角线为主,你将得到向左旋转90度的图像。(该题是求向右旋转90度,如图所示)代码:class Solution {public: void rotate(vector<vector<int>>& matrix) { int n = matrix.size(); .

2021-02-20 11:11:59 104

原创 力扣精选top面试题-------全排列

题目链接思路:这道题就是典型的dfs,是道基础题,用一个book数组来标记某个元素是否存放即可(注意:在结构体中,vector< int >是不能显示的初始化,例如vector< int > temp (20,0)是不会通过编译的。)代码:class Solution {public: vector<vector<int> > ans; vector<int> temp1; int book [200]={0}.

2021-02-20 10:45:34 81

转载 跳跃表( 也是Redis中 sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序 )

1. 跳跃表的原理      学过数据结构的都知道,在单链表中查询一个元素的时间复杂度为O(n),即使该单链表是有序的,我们也不能通过2分的方式缩减时间复杂度。       如上图,我们要查询元素为55的结点,必须从头结点,循环遍历到最后一个节点,不算-INF(负无穷)一共查询8次。那么用什么办法能够用更少的次数访问55呢?最直观的...

2021-02-19 15:49:49 476 2

转载 Go语言----------工作池

golang 固定worker 工作池服务器编程使用最多的就是通过线程池提升服务的并发执行能力,在go语言中,一样可以轻松的构建固定数目的goroutine作为线程池,下面通过计算多个整数的和来说明这种并发范式。设计思路:除了主要的main goroutine ,还需开启以下几类goroutine1,初始化任务的goroutine2,分发任务的goroutine3,等到所有work结束,然后关闭所有通道的goroutinemain主要负责拉起以上的goroutine 冰火取结果程序还需要三个

2021-02-14 08:50:23 134

原创 力扣精选top面试题--------寻找峰值

题目链接思路:首先要注意题目条件,在题目描述中出现了 nums[-1] = nums[n] = -∞,这就代表着 只要数组中存在一个元素比相邻元素大,那么沿着它一定可以找到一个峰值,根据上述结论,我们就可以使用二分查找找到峰值,查找时,左指针 l,右指针 r,以其保持左右顺序为循环条件,根据左右指针计算中间位置 m,并比较 m 与 m+1 的值,如果 m 较大,则左侧存在峰值,r = m,如果 m + 1 较大,则右侧存在峰值,l = m + 1时间复杂度:O(logN)代码:class Sol.

2021-02-10 15:47:16 130 1

原创 力扣精选top面试题-------外观数列

题目链接思路:这道题就是简单地编程题,看题意即可知道这就是一道模拟题,每次进行迭代,然后按顺序数数多少个相同的数字即可。代码:class Solution {public: string countAndSay(int n) { string s("1"); for(int i=1;i<n;++i){ string t; int j=0; while(j < s.s..

2021-02-10 15:41:21 99

原创 力扣精选top面试题-------有效的数独

题目链接思路:这道题可以用几个二维数组来解决,只要是记录行,列,对角线是否合法即可,通过设立二维数组,让arr[ ][10]这个列为10,这样我们就能记录该行该列该对角线1到10的使用情况,然后两个for循环即可。代码:class Solution {public: bool isValidSudoku(vector<vector<char>>& board) { int row[9][10] = {0};// 哈希表存储每一行的每个数是..

2021-02-10 15:29:36 124

原创 力扣精选top面试题---------在排序数组中查找元素的第一个和最后一个位置

思路:这道题依旧是二分专属题,而且还是很典型的题,通过两次二分,这里的话是用到了二分的两个模板:最小范围找最大值以及最大范围找最小值。模板请点击!!!代码:class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { if(nums.empty()) return {-1,-1}; int l=0,r=n.

2021-02-10 12:08:48 60

原创 力扣精选top面试题-------搜索旋转排序数组

class Solution {public: int search(vector<int>& nums, int target) { if(nums.empty()) return -1; int p1 = 0, p2 = nums.size() - 1; int mid = p1; while(p1 <= p2) { mid = (p1 + p2) / 2;

2021-02-10 11:59:05 71

原创 孤儿进程以及僵尸进程总结

前言:我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。孤儿进程:概念:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。当一个进程终止时,

2021-02-09 22:36:27 109

原创 力扣精选top面试题-------- 实现 strStr()

思路:这道题就用双指针来做,这是比较简单的做法,还有一种就是KMP的做法代码:class Solution {public: int strStr(string haystack, string needle) { if ( needle == "" ) //空则返回0 return 0; int hlen = haystack.length(); int nlen = needle.length(); .

2021-02-07 11:12:57 75

原创 力扣精选top面试题-------删除排序数组中的重复项

思路:这道题其实是这个数组是有序的,那么我们就应该知道,相同的数字就是在一起的,是道经典的题,去除相同元素的编程题,那么我们就可以用双指针来做,i,j两个指针,当遍历到不一样的元素的时候,就把 i 上的元素放到 j+1 的位置上来即可。代码:class Solution {public: int removeDuplicates(vector<int>& nums) { if(nums.size()==0) return 0; int .

2021-02-07 10:38:24 74

原创 力扣精选top面试题-------合并K个升序链表

思路:这道题的话,一开始也能想到,类似于合并两个链表的思想,我只要每次找出n个链表的最小值即可,这样时间复杂度偏高,O(n^2);但是我们可以利用优先队列来做,把每个链表的第一个元素放进优先队列即可,这样每次出队的就是最值,时间复杂度低得多,空间上就浪费的多。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode().

2021-02-07 10:27:39 121

空空如也

空空如也

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

TA关注的人

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