自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 刷题第21天(LeetCode #124. 二叉树中的最大路径和)

思路分析:我们将取出最大路径和的路径二叉树中,最顶端的节点成为顶节点,则除了顶节点同时提供了左右两个子节点以外,其他任何一个父节点在最大路径中只能提供左右节点中的其中一个。进行分类讨论:除了顶节点外的其他父节点: 只能提供左右其中一边的值,因此需要进行左右节点可提供的最大贡献值的比较; 即比较此父节点连接其左叉树的收益和连接其右叉树的收益; (注意:当某个子节点贡献值为负数时,我们将选择不连接此节点) (因此需加上子节点贡献值与0的比较)顶节点: 顶节点的选择需要判断: 次一.

2021-02-01 01:03:11 97

原创 刷题第20天(LeetCode #236. 二叉树的最近公共祖先)

思路分析:若一个节点ans为p、q的最近公共祖先,则需满足条件:(p、q分别在ans的左右子树中)或((p、q其中之一是ans)且(p、q其中之一在ans的左右子树中))代码表示为:( lson && rson ) || ( ( root == p || root == q ) && ( lson || rson ) )其中lson表示左子树中是否含p或q;rson表示右子树中是否含p或q;此条件为递归所需的动态判断方程,由此我可以实现递归推导。代码实.

2021-01-31 22:39:04 97

原创 刷题第19天(LeetCode #235. 二叉搜索树的最近公共祖先)

思路分析:因为题目给出的是二叉搜索树,而二叉搜索树的特点是:左叉上节点的值都小于其根节点,右叉上的值都大于其根节点。利用此特性进行解题。若p、q节点的值均小于根节点root,则p、q均在root的右叉上,此时将root节点向右叉节点移一位;同理,若p、q节点的值均大于根节点root,则p、q均在root的左叉上,此时将root节点向左叉节点移一位;经过充分循环使root节点移动后,得到满足条件root节点值介于p与q节点值之间时,就得到了p、q的最近公共祖先,此时返回root。代码实现(c++).

2021-01-30 21:10:10 180

原创 刷题第18天(LeetCode #230. 二叉搜索树中第K小的元素)

思路分析:因为给出的是二叉搜索树,其中序遍历的结果就是按照从小到大排序的,我们只需使用中序遍历,取其第k个元素即为第k小的元素。用循环使root向左下移动,移动同时利用栈储存节点信息。通过获取栈顶元素,返回上一个节点,进行中序遍历。代码实现(c++):class Solution {public: int kthSmallest(TreeNode* root, int k) { int p=0; stack<TreeNode*> t.

2021-01-29 21:27:34 191

原创 刷题第17天(LeetCode #104. 二叉树的最大深度)

代码实现(c++):class Solution {public: int maxDepth(TreeNode* root) { if(root==nullptr) return 0; return max(maxDepth(root->left)+1,maxDepth(root->right)+1); }};运行结果:

2021-01-28 21:28:48 54

原创 刷题第16天(LeetCode #10. 正则表达式匹配)

思路分析:使用指针进行函数的递归推进的方法实现本题所需要的动态转移方程:难点:动态转移方程的构建先对字符串的可能情况以及相对应的结果进行分析:一、s为空时:若p为空,则匹配成功,返回true;若p非空,则匹配不成功,返回false;二、s非空时:若p为空,则匹配不成功,返回false;若p不为空,则需要建立动态转移方程进行求解;三、动态转移方程(s、p均不为空时):1、* p的下一个字符不是‘ * ’时:若匹配成功,则继续匹配下一个s和下一个p(s后移1位,p后移1位);.

2021-01-26 22:45:19 144 1

原创 刷题第15天(LeetCode #28. 实现 strStr())

思路分析:设haystack长度为h,needle长度为n,依次遍历haystack中从0 至(h-n)开头,且长度为n的字符串,并将其与needle进行比较,相同即在haystack中查找到了needle,此时返回 i 即为needle在haystack中出现的第一个位置。代码实现(c++):class Solution {public: int strStr(string haystack, string needle) { if(needle[0]==0).

2021-01-25 21:01:09 64

原创 刷题第14天(LeetCode #151. 翻转字符串里的单词)

思路分析:先将字符串首尾的空格删去,然后遍历删减过后的整个字符串,当遇到“ ”时进行单词的分割(利用if语句实现:1、多个空格时仅进行一次分割;2、结尾处进行一次分割),然后将单词储存到栈中,利用栈的特性翻转单词顺序到新字符串ans中,最后将ans返回。代码实现:class Solution {public: string reverseWords(string s) { stack<string> overturn; string .

2021-01-24 20:31:18 180 3

原创 刷题第13天(LeetCode #43.字符串相乘)

思路分析:由于题目要求,不得使用直接将输入转换为整数进行计算,我们可以利用模拟乘法的竖式计算来完成字符串的相乘。借用LeetCode上的动图模拟:代码实现:class Solution {public: string multiply(string num1, string num2) { int n1=num1.size(); int n2=num2.size(); string res(n1+n2,'0'); .

2021-01-22 21:26:03 67

原创 刷题第12天(LeetCode #137. 只出现一次的数字 II)

一、逐位计算:将nums中的数在二进制中进行处理。对于二进制中的每一位来说,若一个数出现了三次,则此二进制位出现1的次数必为1的倍数。因此将每一二进制位上1出现的次数进行统计后,进行模3运算,得到的就是只出现1次的那个数字在此二进制位上的数值。代码实现:class Solution {public: int singleNumber(vector<int>& nums) { int ans=0; for(int i=0;i&l.

2021-01-21 20:22:10 105

原创 刷题第11天(LeetCode #136.只出现一次的数字)

一、哈希表:将数组中的元素一个一个放入哈希表中,若哈希表中没有此元素则添加,若哈希表中已经存在此元素则删去。,最后哈希表中将仅存一个元素,集只出现过一次的元素。代码实现:class Solution {public: int singleNumber(vector<int>& nums) { unordered_set<int> res; int ans; for(int i=0;i<nums.

2021-01-20 13:57:00 83 1

原创 刷题第10天(LeetCode #148.排序链表)

思路分析:利用一个指针ptr进行遍历,每次循环遍历过整个链表后,取出链表中节点的最小值连接到一个新的链表res后,同时将取最小值的节点值置为INT_MAX。代码实现:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x).

2021-01-20 12:48:03 76

原创 刷题第10天(LeetCode #2.两数相加)

代码实现:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), nex.

2021-01-18 23:11:53 69

原创 刷题第9天(LeetCode #142.环形链表 II)

法一(循环遍历):利用快慢指针法(见#141.环形链表),判断出链表中存在环的同时计算慢指针移动次数为n,快指针移动为2n。则链表入环节点位置小于等于n,链表总位置数小于等于2n,由此建立循环。定义两个指针iptr和jptr嵌套循环进行遍历,直到iptr与jptr相等,说明查找到了入环节点,此时直接返回iptr。(缺点:时间复杂度较高)代码实现(c++):class Solution {public: ListNode *detectCycle(ListNode *head) .

2021-01-17 17:39:55 85

原创 刷题第8天(LeetCode #141.环形链表)

思路分析:快慢指针法:定义两个指针( slow 和 fast ),同时设计一个循环让两个指针在循环中顺着链表移动。两个指针起点相同(都为head),但slow指针每次移动一格,fast指针每次移动两格。因为fast指针运动速度比slow指针快,若链表中无环,则slow指针始终追不上fast指针。若链表中有环,则fast指针会与slow指针在环上运动时相遇。代码实现:/** * Definition for singly-linked list. * struct ListNode { * .

2021-01-16 16:59:38 66

原创 刷题第7天(LeetCode #21.合并两个有序链表)

思路分析:利用迭代法:创建一个新的节点res,将两个链表头节点的值进行比较,将较小的节点连接在res后,同时将对应的链表向后移一位。利用循环反复进行此操作,直到 l1、l2其中一个为空,此时直接将其中非空的链表接在res链表后面。为方便返回res链表,在开始时定义一个哨兵节点reshead用于保存res还未接入 l1、l2时的地址,这样在返回结果时,直接返回reshead下一个节点(reshead->next)开始的链表就可以了。代码实现:/** * Definition for si.

2021-01-15 19:43:07 127 1

原创 刷题第6天(LeetCode #13.罗马数字转整数)

思路分析:由于罗马数字中小的数字放在大的数字右边时,表示加上这个数字,而放在大的数字左边时,则表示减去这个数字,因此我们需要设计语句判断一个罗马数字的加减。我们用循环让罗马数相邻的两个数字依次比较,同时将计算结果保存在sum中:若前数较大则sum加上前数,前数较小则减去前数。注意到边界情况:最后一个数字不必与下一个数比较,总是加的。为简化代码,设计定义一个函数将单个罗马数字转化为整数。代码实现:class Solution {public: int romanint(char k).

2021-01-15 00:37:51 75

原创 刷题第5天(LeetCode #5.最长回文子串)

本题需要分成两种情况讨论,(最长回文子串含奇数个元素/最长回文子串含偶数个元素)。找出最长奇数子串:利用一层循环动态提供回文子串的中心位置i,嵌套一层循环提供子串左右延伸长度j,通过s[i-j]与s[i+j]的依次比较判断子串是否回文,并将最长的奇数回文子串中心位置保存在p中,将延伸长度保存在l中。找出最长偶数子串:利用一层循环动态提供回文子串的中心位置i和i+1(偶数子串中心位置有两个),嵌套一层循环提供子串左右延伸长度j,通过s[i-j]与s[i+1+j]的依次比较判断子串是否回文,并将最长的.

2021-01-13 21:21:46 90

原创 刷题第4天(LeetCode #155.最小栈)

利用辅助栈:定义一个主栈及一个辅助栈(称为min栈),辅助栈用于保存主栈元素中的最小值,对主栈进行操作时,同时对辅助栈也进行相应操作,以保证辅助栈中栈顶元素始终为主栈元素中的最小值。主栈压入一个元素时(push),对压入元素和min栈栈顶元素进行比较,向min栈压入二者中较小的数。主栈删除栈顶元素时(pop),同样删除min栈中的栈顶元素。返回栈顶值时(top),即返回主栈栈顶元素。返回最小值时(getMin),即返回min栈栈顶元素。代码实现;class MinStack {stack&.

2021-01-12 18:17:14 90

原创 刷题第3天(LeetCode #20.有效的括号)

代码实现:class Solution {public: bool isValid(string s) { int n=s.size(); if(n==0) return 1; if(n%2!=0) return 0; int j=0; char a[n]; for(int i=0;i<n;i++) { if(s[i]=='('||s.

2021-01-11 22:20:19 85

原创 刷题第3天(LeetCode #14.最长公共前缀)

使用纵向扫描的方法完成:首先判断字符串数组是否为空,若为空,直接返回空串。若非空,则从首列开始,依次遍历每一列,比较相同列中,不同行的字母是否相同。若相同则继续判断下一行,若不相同则直接利用erase语句擦除第一行的字串中,此列之后(包括此列)的所有字符。最后返回字符串数组中第一行子串(此时第一行子串即为最长公共前缀)。代码实现:class Solution {public: string longestCommonPrefix(vector<string>& st.

2021-01-11 18:08:51 163 1

原创 刷题第2天(LeetCode #9.回文数)

此题可将整数转化为字符串,通过循环依次将对称位置的两个数字进行比较,若所有对称位置的数字均相同,则可判断其为回文数。但考虑到进阶(不将整数转化为字符串解决问题),我们用纯数学的解法来完成。首先,所有的负数均不是回文数,因此我们只需考虑非负数中的回文数判别。我们将整数x先保存在k中,防止程序运行中x数据的改变导致x数值丢失。然后利用整数反转将k反转后储存在y中(使用long型防止反转时数字溢出)。最后将x与y进行比较,若x与y相同,则x是回文数。代码实现:class Solution {p.

2021-01-10 09:38:37 204 1

原创 刷题第1天(LeetCode #7.整数翻转)

刷题第一天(LeetCode 7.整数翻转)class Solution {public: int reverse(int x) { long y=0; while(x!=0) { y=y*10+x%10; x/=10; } if(y>pow(2,31)-1||y<-1*pow(2,31)) return 0;

2021-01-09 19:49:22 97

空空如也

空空如也

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

TA关注的人

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