自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数组中数字出现的次数

两个数相同,异或的结果必然为零,那么把整个数组异或一遍,得出来的结果就是剩下两个单独出现的数字的异或的结果,他们从右到左第一个出现的1证明这是他们第一个不相同的点10010的右边第二个1是不同点,我们可以借此把数组分成两组,用&(1<<2)来分成两组去异或,做后得出的就是两个不同的数既然题目说了一定有个数是1的值,那就先快排一下,然后很容易得到这个数组只有3种情况:情况1: 数组是ABBBCCC...的类型,第一个A就是我们要的情况2:数组是BBBAC...

2022-03-14 12:21:38 329

原创 二叉树遍历迭代

class Solution {public: vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*> st; vector<int> result; if (root == NULL) return result; st.push(root); while (!st.empty()) { ...

2022-03-13 15:37:28 103

原创 位运算加法

这里需要用到二进制加法,在每一位的加法,都有本位和进位,用a&b我们可以模拟进位,同样的a^b我们可以是作为本位的加法,这就和cpu的加法类似,这样我们通过异或 与操作就完成了加法计算的一半(也叫半加器),因为一个全加器需要本位和来自低位的运 -->+-----+ -->|全加器| | 2位 | --&gt...

2022-03-13 14:11:05 266

原创 重建二叉树,MyPow,判断二叉搜索的后序遍历

这道题目首先我们要知道二叉树的先序遍历和中序遍历与树的结构之间有什么关系,同时二叉树的问题一般可以归结为递归问题,同样,我们要构建一棵二叉树,要自顶向下的递归构建,首要的我们就是要知道树的根节点在哪里,我们发现根节点就是前序遍历的首个节点,同时是中序的中间节点,构造一棵二叉树,我们要知道根,左子树区间和右子树区间这样递归构建,先构造root,然后root->left和root->right就可以用我们的递归,当然我们还需要确定好子树的区间,既是左子树的左右位置,右子树的左右位置都要传入...

2022-03-12 19:05:11 219

原创 位运算求和与公共祖先

int sumNums(int n) {char a[n][n+1]; //求和公式 (n*(n+1))/2 利用二维数组的空间性质return sizeof(a)>>1; //内存计算这里用char 一个字节}这里是二叉搜索树,他有一个性质及左边比根节点小,右边比根节点大,对于二叉树的题目,一般情况是可以用递归的来解决的,这里我们只需要判断根节点是否同时小于p,q或者是同时大于p,q,根据这个情况来递归查找左右子树,假如两者都不满足,则证明我们找到了目标节...

2022-03-12 15:16:38 92

原创 美团笔试题目练习

这道题目就是求出最大的不连续的数的个数 例如例子里面的就是1357这是个数,由于他给的是可以重复的数集,我们要先考虑去重,排序,方便我们后续操作int nums[1000000];int dp[1000001];int main(){ int n = 0; cin >> n; for (int i = 1; i <=n; ++i) { cin >> nums[i]; } dp[0] = 0;...

2022-03-10 19:15:21 549

原创 切蛋糕题目

这是切蛋糕,思路就是先做排序,找出最大长度和宽度即可因为这里给的是vector,可能存在不是顺序,所以我们先排序,假如是set,则会默认的自动排序。intmaxArea(inth,intw,vector<int>&horizontalCuts,vector<int>&verticalCuts){sort(horizontalCuts.begin(),horizontalCuts.e...

2022-03-10 18:42:52 370

原创 搜索与回溯算法

这道题目的思路就是递归自底向上判断每个子树的高度,左子树和右子树高度的最大值+1intmaxDepth(TreeNode*root){if(root==NULL){return0;}intleft=maxDepth(root->left);intright=maxDepth(root->right);returnmax(lef...

2022-03-10 11:12:32 110

原创 数据流的中位数

这道题目的思路就是使用两个优先队列,大顶堆和小顶堆,前者放数据流前半部分,后者放后半部分数据,这样他们的堆顶必定是中位数,greater是默认的大顶堆,这里有一点注意,每次插入到一个堆时要先插入另一个堆,返回他的堆顶再重新插入,这样保证每次插入的是大顶堆的最大值,或者小顶堆的最小值classMedianFinder{public:/**initializeyourdatastructurehere.*/priority_queue<int,vect...

2022-03-09 20:00:09 38

原创 用户网站访问行为分析

为了评估某网站的用户转化率,我们需要对用户的访问行为进行分析,并建立用户行为模型。日志文件中已经记录了用户名、访问时间 以及 页面路径。为了方便分析,日志文件中的 N 条记录已经被解析成三个长度相同且长度都为 N 的数组,分别是:用户名 username,访问时间 timestamp 和 页面路径 website。第 i 条记录意味着用户名是 username[i] 的用户在 timestamp[i] 的时候访问了路径为 website[i] 的页面。我们需要找到用户访问网站时的 『共性行为

2022-03-09 17:18:24 1066

原创 扑克牌中的顺子

这道题目本质是求是否是顺子,最重要的一点就是能否想到,最大值减去最小值等于5这个条件,我们用哈希表遍历一次,假如是0,我们则跳过,最重要的就是遍历出最大最小值能否>5,这是本质,同时我们用哈希表去除重复元素的情况boolisStraight(vector<int>&nums){unordered_map<int,int>set;intma=0;intmi=14;for(...

2022-03-08 16:28:03 107

原创 把数组排成最小的数

这道题目的思路,此题求拼接起来的最小数字,本质上是一个排序问题。设数组 nums 中任意两数字的字符串为 a,b假如a+b<b+a则可以证明a要排在b前面,然后套用任何排序就可以了我们用快速排序,顺便复习快排intgetmid(vector<string>&nums,intlow,inthigh){stringtemp=nums[high];inti=low;for(intj=low;...

2022-03-08 16:24:26 80

原创 两个队列模拟栈

这道题目的思路就是我们构造两个队列来模拟,和用栈模拟队列相反,用栈模拟队列是在出队时做特殊处理,而队列模拟栈就是在入栈时特殊处理,我们用一个一个que1和que2,que2作为辅助暂存,入队时,先把数据放入que2,然后判断que1是否为空,不是证明之前曾有数据进来,就把que1的数据全部放入que2,然后交换两个队列,这样新数据就进到了队列头,那么出队就相当于出栈的顺序了MyStack(){}queue<int>que1;queue<...

2022-03-08 13:29:22 222

原创 搜索与回溯算法

这个题目的思路可以用深度优先遍历的先序遍历解决,维护一个path数组和ans数组,,每次先把节点加入path数组,如果得每次把target带入一次递归,满足target==0切此时为叶子节点时我们直接将path加入到ans中,然后递归调用,加入都不满足此时我们要恢复上一次节点的状态,及回退节点public:voiddfs(TreeNode*root,inttarget,vector<int>path){if(root==nullptr)...

2022-03-07 16:15:08 483

原创 搜索与回溯算法

这道题目的做法是采用dfs的递归方式去做,我们要在矩阵中找到是否存在字符串,递归循环的结束条件是当我们的检索到了最后一个字符,即可返回true,那么这个,假如下标越界或者此位置的字符与我们要找的字符不同,同样也是返回false,当然假如相同然后此时字符串也没有搜索完,我们就把当前的字符位置设为空代表我们走过此位置,防止重复搜索,然后,递归地去 board[i][j] 的上下左右四个方向去找,剩下的路径,在 dfs 的过程当中,如果某条路已经不通了,那么那么需要回溯,也就是将 visited[i][j]...

2022-03-06 15:57:00 273

原创 字符串句子的模板

力扣上作者:eh-xing-qing的方法这种题目可以的套模板,先维护一个string数组s += " "; //这里在最后一个字符位置加上空格,这样最后一个字符串就不会遗漏 string temp = ""; //临时字符串 vector<string> res; //存放字符串的数组 for (char ch : s) //遍历字符句子 { if (ch == ' ') //遇到空格 { ...

2022-03-05 15:15:40 99

原创 双指针系列2

这个题目没什么就是判断后复制,主要是我们要自己设置一个伪头结点来操作ListNode*mergeTwoLists(ListNode*l1,ListNode*l2){ListNode*ptr1=l1;ListNode*ptr2=l2;ListNode*ans=newListNode(0);ListNode*ptr3=ans;while(ptr1!=NULL...

2022-03-04 11:22:33 104

原创 双指针系列1

这道题目没什么好说的,就是分为两种情况,要删除的链表节点是头结点和要删除的节点是非头结点ListNode*deleteNode(ListNode*head,intval){if(head==NULL)returnNULL;ListNode*ptr=head;if(ptr->val==val)returnptr->next;while(ptr->next!=NULL&&...

2022-03-03 09:52:31 449

原创 动态规划三

这是动态规划系列的题目,当这里是将字母翻译成数字,数字的组合可以可以有一种或两种的翻译比如数字1是一种,数字12也是一种,从前面往后看很难有个直观判断,如果从后往前看,我们可以发现,假设我们设置一个dp方程,又来存储每i个的翻译的方法的总数,我们会发现,dp[i]=dp[i-1]或者dp[i]=dp[i-1]+dp[i-2],其实类似于青蛙跳台阶问题,对于他的变形,我们要判断dp[i-2]是否要加上,取决于这个数是否在10-26之间,一个数字至少能翻译一种所以dp[i]=dp[i-1],在判断i-2..

2022-03-02 16:48:00 190

原创 动态规划二

这也是一道经典的题目,思路是找到动态方程f(i)=max(f(i)+pre(i-1),f(i)),遍历数组,判断是上一个子序和这次的f(i)大还是比这个f()小,大的化保存到pre,往下遍历,小的化,舍弃之前的pre,将此次的f(i)开始重新生成新的自序和,pre作为前一次的子序和,最后用max来存保存此次的子序和历史最大自序和中的最大值 intmaxSubArray(vector<int>&nums){intpre=0;...

2022-03-01 13:48:16 77

原创 归并,快速,堆排序

归并排序#include<iostream>void merge(int arr[], int tempArr[], int left,int mid, int right)//合并{ //左半区第一个未排序 int l_pos = left; //右半区第一个未排序 int r_pos = mid + 1; //临时数组元素下标 int pos = left; //合并 while (l_pos < mid &a...

2022-02-28 18:09:51 111

原创 动态规划一

这道题目的思路是找到一个动态方程,这题的每个数值可以有前面两个相加的到,故f(x)=f(x-1)+f(x-2);同时把特殊情况先排除即可intfib(intn){if(n<2)returnn;inta=0;intb=1;intc=0;for(inti=2;i<=n;i++){c=(a+b)%1000000007;...

2022-02-28 13:57:34 172

原创 二叉树的镜像和对称二叉树

这个题目的思路就是你既然要翻转你的子树,那你就可以使用递归先把叶子节点先交换,在往上面交换,比如先交换2节点下面的1,3往上走,交换4节点下面的2,7,最后就就完全翻转了。voidswaptree(TreeNode*root){if(root==NULL){return;}swaptree(root->left);swaptree(root...

2022-02-27 13:33:22 323

原创 树的子结构

这个题目比较抽象,要用深度优先遍历来解决,一个dfs函数用来深度判断,子树结构是否完全相同。终止条件:1.当B节点为空的时候,说明B节点已经判断完全,说明存在子结构,返回true2.当A节点为空,说明此时B不为空,证明越过A节点,子结构不存在,返回false3.如果A,B节点值不同直接返回false4.然后就是A,B相同,那么需要递归判断A的左右子节点和B的左右子节点,用&&连接这里要注意,B为空这个条件必须为第一个,假如不是的话可能会出现已经越过B节点了,此..

2022-02-27 13:20:02 107

原创 从上到下打印二叉树

这道题目就是层序遍历,解题思路就是我们维护一个队列,和一个答案数组,每次从队列里面取出一个,将他的值放入数组,判断这个取出来的节点是否存在左右子节点,存在则放入队列中,循环的退出条件是,当队列为空。vector<int>ans;queue<TreeNode*>que;if(root==NULL)return{};que.push(root);while(!que.empty())...

2022-02-26 11:45:22 127

原创 旋转数组的最小数字

这道题目也是一个有序数组的变形,所以我们可以考虑二分法的方式来做,同样套入二分法分模板,这里我们选择数组的最右的那个数字来判断,原因在最小值右侧的元素,它们的值一定都小于等于 xx;而在最小值左侧的元素,它们的值一定都大于等于 xx,分三种情况,假如中间的值大于最右侧,则我们可以认为要找的最小值在右半区,l=mid+1,假如中间值小于最右侧,我们则认为右边正常,直接r=mid,最主要的是特殊情况中间值等于最右边的值,犹豫不知道最低点是在中间点的左边或者右边,假如暴力缩减有可能直接忽略了最低点...

2022-02-25 11:50:55 267

原创 二维数组中的查找

这个题目有一个技巧,从矩阵的右上角开始看,会发现是一课二叉搜索树,左边比根节点小,右边比根节点大,所以就比较简单了,直接在次函数内解决或者写一个函数外部递归调用。两个是消耗都差不多。if(matrix.size()==0||matrix[0].size()==0){returnfalse;}inti=0;intj=matrix[0].size()-1;while(i...

2022-02-25 11:07:22 358

原创 一些知识点

请说说已经有malloc函数了为何还要引进new?答:当用在内置数据类型或者结构时,malloc能满足我们的需要,但用在类类型时不能,这就需要引用new,new既分配堆内存,又自动调用类的构造函数来创建对象。一、new 与 opeartor newnew是C++内部定义的一种操作符,总像sizeof一样是一种操作符,而operator new是实作者定义的一个是操作符,一个是全局函数,而不是原来所以为的是重载的关系。正同我们看看他们各有什么用?new操作符作了三件事.语句:...

2022-02-24 19:22:24 31

原创 查找缺失的数字_二分法

这题目相当于前一题的变形,但我还是想了很久,还是一样的可以套模板,但是还是要考虑特殊的情况,即缺失的是最后的一个,用二分法的模板解决不了,所以在二分法前我们需要进行判断nums[len-1]==len-1这个判断,就是说序列都是正常的,但是缺少最后一个,比如说n=3,给出的序列[0,1]看似没问题,其实缺少了2。intlen=nums.size();//特殊情况:从左到右都+1,即缺失的是最后一个,如[0,1,2,3,4,5,6,7,8]缺9if...

2022-02-24 16:00:08 707

原创 在排序中查找数字_二分法

二分法可以用于已经排好序的数组,这里给出两个模板这里的两个模板,都是二分法的,没有规定一定要用哪个,只是我们在写代码的时候要注意,l的取值,如果是l=mid则我们需要将mid的值加一,这里是为了消除/号的向下取整导致的无限循环,整体的思路,我们可以求出重复的数字的左右边界left和right,通过r-l+1求出出现数量,这里一般优先取r值,应为循环的结果是l<r,所以l值会大于r值,l可能会越界,所以我们优先取r,接着是先求出begin的值,假如nums[mid]>=targe...

2022-02-24 14:09:32 612

原创 左旋转字符串

有点脑经急转弯的感觉,局部旋转+全局旋转就可以完成这个,先旋转前n个,再旋转n后面的全部,最后全部再旋转一遍即可。stringreverse(string&s,intstart,intend){while(start<end){chartemp=s[start];s[start++]=s[end];s[end--]=temp;...

2022-02-23 14:53:59 97

原创 空格替换题解

这个题目有个坑,就是本身空格是占一个位置的,但是这里要换成3个位置的字符串,如果不修改字符串大小,则每次只能替换最后一个,所以先数出空格个数,修改字符串的大小,从后面往前面复制,分别记录新旧字符串的末尾做i,j指针,从后面像前面复制,跳出循环的条件则是i==j,表示已经没有空格了,因为每次i向前1格,而j是向前移动3格int size = s.size(); int count = 0; for (auto c : s) { if (c == ' ')...

2022-02-23 14:24:55 183

原创 最大子序和

每次写最大自序和,都忘记,这次写下题解,个人认为思路就是要随时保存一个最大和的数组,比如用一个pre来存上一次的最大的数组和,然后每次和新的假如的数作比较,例如max(pre+i,i),比较两者大小,看看当前数组加上这个数字后的大小是否变大了,是的话更新pre,同时更新max和,类似于滚动数组,因为pre只是保存此时的最大值,不一定是全部的最大,所以每次需要用max来存最大值。...

2022-02-22 17:44:47 85

原创 复杂链表的复制

复杂链表的复制的难点就是如何把random节点的复制出来,正常链表的复制就是遍历链表,复制节点,但是这里有乱序节点,有可能当指针指向时还未生成该链表,所以可以用哈希表来存储节点,第一次遍历链表,将每个节点放入哈希表,同时,存入一个新的节点newNode(cur->val),此时他作为value值只是一个单节点,没有next也没有random,而原来cur作为key,这里没一个节点包含一个完整的链表结构,拥有他的next和random,第一次遍历相当于,图1,构建原链表和新未连接的链表节点,第二次...

2022-02-22 14:55:27 732

原创 用两个栈实现队列

队列的特性是先进先出,而栈是先进后出,要用栈来模拟的话需要考虑辅助栈,当然队列入队和栈的入队的操作一样,都直接push_back,但是出队列需要用到辅助栈,即每次pop出一个元素,就从辅助栈中pop出元素,假如辅助栈为空,那么此时我们需要将主栈的元素push到辅助栈中,外层一个if判断是否为空,接着用while全部放入辅助栈,如果此时辅助栈仍为空,则队列为空,否则辅助栈弹出的元素就是队列弹出的元素。辅助栈剩下的元素则会被下一次的if判断辅助栈不为空,直接弹出剩下元素,不会影响顺序。因为下一次进入的元...

2022-02-22 13:27:25 180

原创 翻转链表解法

这道题每次做都会忘记,这里写下题解,翻转链表的精髓是在于用一个pre节点来存储上一个节点,用pre来指向NULL(相当于此时的pre指向链表的末端),用cur指向当前头结点,通过temp节点来断开连接暂存头结点之后的连接节点,此时将cur的next指向pre,更新pre和cur节点,此时注意,假设节点1和2还未连接,这里交给下一次判断中的cur->next=pre.就像是第一次中1节点还未和null连接的状态。ListNode*reverseList(ListNode*head)...

2022-02-22 13:15:24 279

空空如也

空空如也

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

TA关注的人

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