自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

大灰狼吃树皮

爱学习的小当家

  • 博客(241)
  • 收藏
  • 关注

原创 leetcode做题记录

剑指offer-28:对称的二叉树剑指offer-27:二叉树的镜像剑指offer-07:二叉树的重建剑指offer-37:序列化二叉树leetcode-99:恢复二叉搜索树剑指offer-32:从上到下打印二叉树剑指offer-68:二叉树的最近公共祖先剑指offer-36:二叉搜索树与双向链表、剑指offer-33:二叉搜索树的后序遍历序列leetcode-3:最长无重复字串leetcode-440:字典序的第K小数字leecode-52:N皇后问题leetcode-494:目标

2021-01-06 20:32:51 96

原创 其他问题总结

问题总结1.Ubuntu1.1禁止休眠1.Ubuntu1.1禁止休眠

2021-01-06 20:22:35 60

原创 基础知识总结

面试问题总结1.C++问题2.算法1.C++问题声明和定义申请二维数组深拷贝和浅拷贝int *p=ew int [3];STL中的vector,list,set,map2.算法判断数组是否有三个递增元素(不要求连续)

2020-12-21 15:52:50 241

原创 muduo库学习总结

mudou学习笔记1.关键类1.关键类5个关键Buffer、EventLoop、TcpConnection、TcpClient、TcpServer

2020-11-11 15:29:52 393

原创 【Cuda编程指南】

开新坑,Cuda编程,不定时更新。

2023-07-30 15:43:43 92

原创 【1】PaddlePaddle介绍

前言:开个坑,将PaddlePaddle源码的,以后不定期更新。

2023-07-30 00:26:45 296

原创 一次生成随机数引发的思考

一次生成随机数引发的思考问题描述和解决进一步的思考:随机数是如何生成的问题描述和解决问题描述:在学习一致性hash的时候遇到的一个问题,当我使用随机字符串测试的时候,造成了雪崩效应(所有的数据都打到一个机器上)。bug定位:首先我排除了hash函数(没有哈希冲突),最终将问题定位在随机字符串生成上。我的随机字符串生成的代码是下面这样的。随机字符串生成的逻辑很简单,在结果字符串的位置 i 上,从备选字符中随机挑选一个字符作为当前位置的元素。但是问题出现在每次生成随机字符串都要重置种子上,这样会导致一个

2022-03-16 22:28:54 527

原创 链表的环,数学推理

一言以蔽之:目前遇到的题解没有描述清楚走了n圈的情况。正文:是否有环快慢指针走,为空无环,相遇有环环的起点快慢指针在环的某个节点相遇,称其为相遇点;设相遇点距离环的起点为m,head距离环的起点为x,环的长度为L。有下式:k=x+m+k1L2k=x+m+k2L合并两式得到:(k2-2*k1)*L-m=x这意味着从头往后走,从相遇点往后走,最终会相遇在环的起点。环的长度环的长度L=(x+m)/(k3+1)x是第二次相遇时走了多少步,m是起点距离第一次相遇点的距离,k3是经过了相遇点

2022-01-10 23:03:03 205

原创 leetcode-141、142:环形链表

leetcode-141:环形链表判断链表是否有环/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: bool hasCycle(ListNode *head) {

2021-07-02 11:05:58 117

原创 比n大的最小不重复数

题目描述:给定N是一个正整数,求比N大的最小“不重复数”,这里的不重复是指没有两个相等的相邻位,如1102中的11是相等的两个相邻位故不是不重复数,而12301是不重复数。思路:先对n加1,然后从最高位往后遍历,如果相邻两位相等(s[i]==s[i+1]),低位加1(s[i+1]++),如果需要进位就往前进位;然后把[s.begin()+i+2/3,s.end()),换成010101。2/3取决于进位有没有进到最高位(即增加一位)。最后一直到最后(while(i<s.size()-1))// 求比

2021-06-08 19:58:32 625 2

原创 牛客--树的直径

思路:dfs使用unordered_map<int,vector> memo;创建图,然后使用dfsclass Solution {public: /** * 树的直径 * @param n int整型 树的节点个数 * @param Tree_edge Interval类vector 树的边 * @param Edge_value int整型vector 边的权值 * @return int整型 */ stru.

2021-06-03 20:51:36 91

原创 JZ10-矩形覆盖

动态规划:2n的覆盖方法数=2(n-1)的覆盖方法数量+2*(n-2)的覆盖方法数。因为2*(n-1)加一个竖着的,2*(n-2)加两个横着的,就是2*n。即当前状态由最后一个的不同状态转移而来。class Solution {public: int dp(int n){ if(n==0) return 0; if(n==1||n==2) return n; else return dp(n-1)+dp(n-2); } int r.

2021-05-24 22:36:23 54

原创 JZ9-变态跳台阶

最后返回的是pow(2,number-1);推到dp[i-1]=dp[i-1]+dp[i-2]+…+dp[1]+1dp[i]=dp[i-1]+dp[i-1]+dp[i-1]+dp[i-2]…+dp[1]+1=2*dp[i-1]。i>=2dp[1]=1;dp[2]=2;dp[i]=pow(2,i-1);class Solution {public: int jumpFloorII(int number) { return pow(2,number-1); .

2021-05-24 22:29:20 76

原创 2021-05-24

跳台阶:最后一次跳的方式是:跳1个台阶 or 跳2个台阶,将两种方式相加就是这次跳台阶的方法。class Solution {public: int jumpFloor(int number) { vector<int> dp(number+1,1); dp[1]=1; dp[2]=2; for(int i=2;i<=number;i++) dp[i]=dp[i-1]+dp[i-2]; .

2021-05-24 22:15:55 61

原创 JZ2-替换空格

//遍历,如果遇到空格,执行s.replace(i,1,"%20");

2021-05-24 22:11:02 70

原创 JZ7-斐波那契数列

定义:非递归,使用寄存器。状态转移:f(n)=f(n-1)+f(n-2);class Solution {public: int Fibonacci(int n) { if(n==0) return 0; if(n==1) return 1; int p0=0,p1=1,p2; for(int i=2;i<=n;i++){ p2=p1+p0; p0=p1; .

2021-05-24 22:09:04 79

原创 JZ6-旋转数组的最小数字

旋转数组,二分查找,中间的数比右边的大,可以全部舍去左边的数;如果中间的数小于等于右边的树,可以舍去右边的一个数。核心思路:和右边界进行比较。核心代码while(left<right){ if(arr[mid]>arr[right])left=mid+1; else if(arr[mid]<=arr[right])right-=1;}return arr[left];整体代码class Solution {public: int minNumberInRot.

2021-05-24 22:02:01 110

原创 JZ5-用两个栈实现队列

push时一直push到主栈pop时如果辅助栈为空,将主栈的元素push到辅助栈中,然后pop辅助栈中的元素。class Solution{public: stack<int> s1;//存储数据 stack<int> s2; void push(int node) { s1.push(node); } int pop() { if(s2.empty()){ if(s1.em..

2021-05-24 21:55:56 71

原创 JZ4-重建二叉树

使用pre[l1]找到vin[index]得到左子树的数量left=index-l2,右子树的数量right=r2-index创建根节点,根节点的左子树=build(l1+1,l1+left,r1,index-1);根节点的右子树=build(l1+left+1,r1,index+1,r2);最后返回根节点/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; *..

2021-05-24 21:54:06 252

原创 JZ3-从尾到头打印链表

使用vector正序储存,倒序返回/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) {* }* };*/class Solution {public: vector<int> printListFromTailToHead(ListNode.

2021-05-24 21:09:54 55

原创 JZ1-二维数组的查找

描述每一行递增,每一列递增。从右上角进行查找,如果当前值大于目标值,往左走,如果当前值小于目标值,往下走。核心:走的方向是两个顺序,也可以从左下角走。class Solution {public: bool Find(int target, vector<vector<int> > array) { int n=array.size(); int m=array[0].size(); int i=0,j=m-1; .

2021-05-24 20:49:20 63

原创 二叉树的序列化和反序列化

函数模型class Solution {public: char* Serialize(TreeNode *root) { } TreeNode* Deserialize(char *str) { }};关键点:序列化使用队列。反序列化使用vector创建结点,然后串起来。优先使用迭代法序列化:如果根节点是空,返回"# “。定义 ostringstream out;将根节点压入队列,一直循环到队列为空。在循环中,如

2021-05-19 11:39:19 78

原创 牛客-在O(1)的空间复杂度内实现k个一组反转链表

头插法pre保存上一段的尾节点cur保存下一段的头节点temp是cur后面的一个节点,不断拿出来插入pre后面遍历得到长度,直到几个段反转,每个段反转k-1次。class Solution {public: ListNode* reverseKGroup(ListNode* head, int k) { int length=0; ListNode* t=head; while(t){ length++;

2021-05-18 20:11:00 99

原创 牛客网--二叉树的序列化和反序列化

定位当前值,使用s给char*指针所指向的元素赋值。注意,传进去的字符串参数需要是引用。使用char*返回string s;char* res=new char[s.size()+1];for(int i=0;i<s.size();i++) res[i]=s[i];res[s.size()]='\0';return res;使用char*初始化TreeNode* der(char* str){ string data(str,str+len); return build

2021-05-18 19:41:16 105

原创 剑指 Offer 49. 丑数

思路:更大的数是由小一些的数乘以2、3、5得到的,但是要取更小的那一个。dp[a]*2,dp[b]*3,dp[c]*5逐步往后走,遇到重的就跳过去。所有的数都被乘以a之前的数都被乘以2过,所以不用往回找。代码class Solution {public: int nthUglyNumber(int n) { vector<int> dp(n,0); dp[0]=1; int a=0,b=0,c=0; for.

2021-05-14 22:05:24 55

原创 剑指 Offer 45. 把数组排成最小的数

思路:将数组转换为,对字符数组进行排序排序函数是 return s1+s2<s2+s2;class Solution {public: string minNumber(vector<int>& nums) { vector<string> ns(nums.size(),""); for(int i=0;i<nums.size();i++){ ns[i]=to_string(nums[i]);.

2021-05-14 20:41:22 59

原创 剑指 Offer 44. 数字序列中某一位的数字

思路:先找到n对应的区间在哪里,定位start从start的0位开始数,第n个数组。remain=start+(n-1)/digit;index=(n-1)%digit;return to_string(remain)[index];class Solution {public: int findNthDigit(int n) { if(n<=9) return n; n-=9; int start=10; int .

2021-05-14 20:11:26 58

原创 剑指 Offer 40. 最小的k个数

思路:快排,二分查找class Solution {public: void quicks(vector<int>& nums,int left,int right,int k){ if(left<=right){ int i=left,j=right; int x=nums[left]; while(i<j){ while(i<j&am.

2021-05-14 19:55:04 58

原创 剑指 Offer 43. 1~n 整数中 1 出现的次数

思路,累加每一位是1的数量高位,当前位,低位。位因子代表个位(1),十位(10)当前位分为三种情况当前位小于1,res+=高位*位因子,当前为等于1,res+=高位*位因子+低位+1当前为大于1,res+=(高位+1)*位因子即:switch(cur){ case 0:res+=high*digit;break; case 1:res+=high*digit+low+1;break; case 2:res+=(high+1)*dight;break;}low=low+cur*dig.

2021-05-14 17:20:07 43

原创 剑指 Offer 39. 数组中出现次数超过一半的数字

方法1:排序找中点方法2:哈希表记录方法3:摩尔投票法摩尔投票法原理:众数的票可以和其他的票抵消,最后的票数大于0代码:初始化众数为x=0,票数为0遍历数组,如果vote等于0,设置当前值为众数,如果当前值等于众数,自增;不等,自减。class Solution {public: int majorityElement(vector<int>& nums) { int x=0,vote=0; for(int i=0;i<nu.

2021-05-14 16:43:31 44

原创 剑指 Offer 38. 字符串的排列

思路:回溯+哈希表class Solution {public: vector<string> res; unordered_map<string,int> memo; void getRes(string s,string trace){ if(s.size()==0) { if(memo.find(trace)==memo.end()){ memo[trace]=1; .

2021-05-14 16:23:34 50

原创 剑指 Offer 35. 复杂链表的复制

使用哈希表存储旧节点和新节点的对应关系,使用旧节点找到复制的对应的新节点。初始化链表的next后,对新节点的每个random进行赋值:memo[t]->random=memo[t->random];代码class Solution {public: Node* copyRandomList(Node* head) { if(head==NULL) return NULL; unordered_map<Node*,Node*> .

2021-05-14 16:10:32 53

原创 剑指 Offer 31. 栈的压入、弹出序列

用栈实际模拟两个进栈和出栈的顺序策略如下:结束条件:全部push完,但是栈顶元素不等于popped[j]转移条件:如果栈为空,或者栈顶元素不等于popped[j],s.push(pushed[i++])如果栈不为空并且栈顶元素等于popped[j],s.pop并且j++。class Solution {public: bool validateStackSequences(vector<int>& pushed, vector<int>& po.

2021-05-14 15:56:04 52

原创 随机算法之水塘抽样算法

目录1.随机抽取一个元素2.随机抽取k个元素3.题目leetcode-398. 随机数索引leetcode-382. 链表随机节点对于无限长数组:1.随机抽取一个元素第i个元素被抽取的概率是1i\frac{1}{i}i1​2.随机抽取k个元素第i个元素被抽取更新的概率是:ki\frac{k}{i}ik​第i个元素被抽取更新到特定位置的概率是:ki1k=1i\frac{k}{i}\frac{1}{k}=\frac{1}{i}ik​k1​=i1​第i个元素没有被抽取更新到某个特定位置的概率是:1−

2021-05-14 15:24:36 204

原创 剑指 Offer 62. 圆圈中最后剩下的数字

约瑟夫环问题,反推,不上第m个位置,当前的下标是多少,依次从两个人到n个人。class Solution {public: int lastRemaining(int n, int m) { int res=0; for(int i=2;i<=n;i++) res=(res+m)%i; return res; }};...

2021-05-13 20:55:44 43

原创 剑指 Offer 34. 二叉树中和为某一值的路径

思路:dfs注意:路径要使用临时变量,不能使用引用,因为可能会在其他路径对其的修改没有撤销class Solution {public: vector<vector<int>> res; void getRes(TreeNode* root,int target,vector<int> combine){ if(root==NULL) return; combine.push_back(root->val);.

2021-05-13 20:39:04 52

原创 剑指 Offer 26. 树的子结构

思路:is是去找那个点,helper是判断这个点是不是。是的情况:当前值匹配,左右子树匹配。base case:BNULL,匹配上了,return true;ANULL,查询过头了,return false。class Solution {public: bool isSubStructure(TreeNode* A, TreeNode* B) { return (A!=NULL&&B!=NULL)&&(helper(A,B)||isSubSt.

2021-05-13 20:04:51 46

原创 剑指 Offer 17. 打印从1到最大的n位数

得到最大值,依次赋值class Solution {public: vector<int> printNumbers(int n) { string s=""; while(n){ s.push_back('9'); n--; } int sum=atoi(s.c_str()); cout<<sum; vector<int.

2021-05-13 16:52:10 50

原创 剑指 Offer 16. 数值的整数次方

思路:快速求幂,时间复杂度是log2 N核心代码while(n){ if(n%2==1) res*=x; x*=x; n>>=1;}return res;答案代码class Solution {public: double myPow(double x, int n) { double res=1; bool flag=(n>0); if(n==INT_MIN) { n>>=.

2021-05-13 16:36:30 51

原创 剑指 Offer 15. 二进制中1的个数

思路:n&(n-1)是去掉n的二进制的最低位的1。class Solution {public: int hammingWeight(uint32_t n) { int res=0; while(n){ res++; n=n&(n-1); } return res; }};

2021-05-13 16:15:29 43

空空如也

空空如也

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

TA关注的人

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