自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LeetCode Day21 回溯算法(1)

77 组合题目给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。思路用循环的思路考虑,如果n=4,k=2,则两次循环,外循环i从1~4,内循环为i+1- - -4, k为多少就需要进行多少次循环。递归的思路与循环的思路类似,每次递归嵌套一个for循环,k次递归就相当于进行了k次循环。代码class Solution {public: vector<int> path; vector<vector<int>> res;

2021-04-12 19:57:02 139

原创 LeetCode Day21 二叉搜索树

701 二叉搜索树中的插入操作题目将给定值插入到二叉搜索树中,返回插入后二叉搜索树的根节点,树在插入后仍然要保持为二叉搜索树。思路递归来解决,结束条件为当前节点为空,则应该在这个位置插入节点。每次递归,可以根据插入值的大小来决定递归方向。新加入节点的值可以赋给root->left或root->right,这样可以保证新加入节点有正确的父节点。代码/** * Definition for a binary tree node. * struct TreeNode { *

2021-04-11 19:53:57 159

原创 LeetCode Day20 二叉树

501 二叉搜索树中的众数题目理解找到二叉搜索树中出现频率最高的元素,可能并不唯一。思路想要不使用额外空间,要在边遍历二叉树的同时,输出频率最高的元素。如果不是搜索树,需要将二叉树中元素出现的频率统计下来,然后找到出现频率最高的元素,但二叉搜索树按照中序遍历是有序的,只需要将相邻的元素比较,把出现频率最高的输出即可。怎样边遍历边输出呢,需要用一个变量count来统计元素出现次数,用maxcount表示当前的最高频率,如果count>maxcount,则更新maxcount,将元素输出到结果

2021-04-09 21:31:56 150

原创 LeetCode Day19 二叉树

100 相同的树题目给定两棵二叉树的根节点,判断两棵二叉树是否相等。思路递归的思路是判断两棵二叉树的左右子树是否相等,当两棵二叉树的对应位置不相同时,返回false,与判断二叉树是否镜像对称类似,只不过从一棵树变成了两棵树。递归终止的条件,需要分指针为空和不为空的情况,指针为空分为①二叉树1指针为空,树2指针不为空,返回false;②树1不为空,树2为空,返回false;③树1 树2都为空,返回true;则剩下的情况就是两棵树对应节点都不为空,此时如果两树节点所指的值不同,则返回false;接着就

2021-03-31 21:28:13 141

原创 LeetCode Day18 二叉树的所有路径

257 二叉树的所有路径题目返回二叉树从根节点到叶子节点的所有路径。思路按照前序遍历的顺序,访问每个叶子节点,不过需要注意的是在递推过程中,保存当前叶子节点的路径后,需要回退一个节点才能进入另一个路径。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() :

2021-03-30 20:08:06 98

原创 LeetCode Day17 二叉树

226 翻转二叉树题目翻转二叉树:eg: 思路翻转二叉树就是要翻转每个结点的左右孩子,需要考虑的是用什么顺序来翻转,用前序、后序、层序都可以,中序遍历不可以的原因在于中序遍历是按照左中右的顺序遍历二叉树,我们来模拟一下,先翻转左孩子,然后翻转中间结点,这时翻转后的左孩子变为了右孩子,再翻转右孩子实际上还是对原来的左孩子操作,显然不行。通过递归来翻转二叉树,先考虑结束条件是根节点为空则不需要翻转,按照后序遍历的顺序来翻转,每次翻转,先翻转左子树,再翻转右子树,然后交换翻转后的左右子树。迭代法

2021-03-29 21:12:52 95

原创 LeetCode Day16 二叉树遍历

二叉树的迭代遍历144 二叉树的前序遍历思路递归的实现是用栈来实现的,因此二叉树的遍历也可以用栈来实现。对于前序遍历,输出结点顺序是中左右,每次先处理中间结点,和结点访问的顺序相同,接着右节点,左节点入栈,这样可以保证先输出左节点。如果当前栈顶结点不为空,则当前结点出栈后继续入栈它的左右结点;如果当前栈顶结点为空,则将当前结点出栈,直到栈顶结点不为空。代码/** * Definition for a binary tree node. * struct TreeNode { *

2021-03-26 18:54:10 103

原创 LeetCode Day15栈与队列2

239 滑动窗口最大值题目理解给定整数数组nums,以k个数字为单位,寻找k个数字中的最大值。思路①超时的暴力解法:一开始想到的就是两层循环,一层遍历数组元素,直到第size()-k位,另一层寻找k个数字中的最大值。时间复杂度为O(kn)。②题解中的方法,利用单调队列来处理数组。首先,题目是寻找滑动窗口中的最大值,每次移动,相应的窗口会少一个元素再加一个元素,和出队、入队的操作很相似。我们需要的队列操作应该是每次pop一个元素,push一个元素,然后队首元素为队列中的最大值,也就是我们需要的结

2021-03-25 20:17:26 130

原创 LeetCode Day14 栈与队列

232 用栈实现队列题目理解用两个栈实现队列的功能,支持队列的所有操作。栈只能使用基本操作。思路队列是先进先出,栈是后进先出。怎样用栈实现先进先出的功能呢,用两个栈,一个入,一个出。当执行队列的push操作时,入栈push;执行队列的pop操作时,需要把栈中最先进入的元素pop出,因此需要将入栈依次pop(),然后push到出栈中,直到入栈为空,此时栈中最先进入的元素就是出栈的top()元素。查询队首元素,与队列的pop()操作类似,因此,可以在pop()的基础上,读出队首元素,再把pop出来

2021-03-24 21:35:03 125

原创 LeetCode Day13 KMP+双指针

459 重复的子字符串题目理解判断给定字符串是否能由重复子串构成,重复子串,因此子串的长度一定小于字符串的长度/2。思路借鉴一下别人的思路,可以转变为在一个串中查找另一个串的问题,KMP可以有效解决这一问题。我们假设字符串s是重复的,s=aaaaa,其中a为最小的重复子串,则s+s=aaaaaaaaaa,此时s+s中必有两个s,我们从字符串的第二位开始匹配是否能找到s,就可以判断s是否由重复子串构成。如果s不重复,如s=abcd,则s+s=abcdabcd,当我们从第二位开始匹配时,从s+s中找到的

2021-03-23 20:36:20 82

原创 LeetCode Day12 字符串

541 反转字符串Ⅱ题目给定字符串s 和 整数k,对字符串每隔2k个字符的k个字符进行反转。如果剩余的字符少于k个,则全部翻转;少于2k,大于k,翻转前k个。思路每隔2k个字符进行翻转,因此只要考虑需要翻转字符的开头即可。用 i 来遍历字符串,每次 i+=2k ,这样 i 就表示需要翻转字符串的头,接着对i后的k个字符进行翻转即可。翻转可以使用双指针,一个指向头,一个指向尾。代码class Solution {public: string reverseStr(string s,

2021-03-22 21:07:35 144

原创 LeetCode Day11 哈希表

202 快乐数题目理解何为快乐数,一个正整数,每次将该数替换为各个位置数字的平方和,循环直到该数变为1,则为快乐数,若无限循环变不为1,则不是快乐数。思路题目说了可能会无限循环变不为1,则说明在每次循环的过程中,可能会存在平方和在前一时刻已经出现过,这样就会陷入无限循环,说明不是快乐数。那么问题就变成了:①求平方和②判断平方和是否出现过。判断的方法可以使用哈希数组,也可使用快慢指针。代码哈希数组class Solution {public: int getSum(int n) {

2021-03-12 20:06:09 57

原创 LeetCode Day10 链表 哈希表

206 反转链表思路①迭代 使用双指针,pre和cur,pre记录当前结点的前一结点,cur记录当前结点,链表反转即为让当前结点的next指针指向前一结点,因此要将当前结点的next指针存下来。接着移动pre和cur,直到cur指针为null,此时的pre指针就指向了新的头结点。②递归法考虑把反转链表分为两部分,一是反转头结点,二是反转剩余结点,头结点的反转就是让头结点的下一个结点的next指向头结点(注意此时的下一节点是剩余结点反转后的下一结点),再让头结点的下一节点置为null;头结点的下一个结

2021-03-11 21:07:52 142

原创 LeetCode Day9字符串+链表

299 猜数字游戏题目理解给定两个数组secret、guess。公牛:两个数组对应位置的数字相等。奶牛:数字相等,位置不同。每位数字只统计一次,例如“1123” “0111”,第二个1为公牛,第三个或第四个1为奶牛(换句话说,如果“11231” “01110”,第三第四个1都为奶牛)。思路公牛数容易求得,遍历两数组,对应位置元素相等则公牛数+1。考虑用哈希表统计secret数组中出现的字符,求公牛数的过程中,将公牛数字对应的数量-1(代表该数字已被用过)。接着求母牛数,因为哈希表中的数字都是

2021-03-10 19:28:32 97

原创 LeetCode Day8 滑动窗口

467 环绕字符串中唯一的子字符串题目理解①S是个“a~z”无限环绕的字符串,参数中也没有显式给出S。②给定字符串p,寻找s中p的不同子串,即p的子串数目,注意子串,即要求连续。思路首先,p的子串怎样在S中找到,要注意到S中的相邻字符有两种情况,一是差值为1,另一种是z和a相邻。如果p非空,以“bzab”为例,显然p[0]=b一定是一个子串,再接着看p[1]=z,p[1]不满足上述两种情况,则“bz”不是子串,"z"为子串,接着p[2]=a,满足条件,则增加的子串为“a”,“za”,接着p[3]

2021-03-09 20:48:41 84

原创 LeetCode Day7 字符串

434 字符串中的单词数题目理解统计字符串中的单词个数,单词指的是以空格为界限分开的字符。例如Hello, my name is John,单词分别为:Hello,、my、name、is、John 。思路当字符不等于空格时,说明当前字符构成单词,怎样判断当前单词结束呢,就是遇到空格时.因此计数器累加的条件就是当前字符不为空格,前一个字符为空格或是当前字符为首字符且不为空格,输出计数器结果即为所求。代码class Solution {public: int countSegments(s

2021-03-08 20:24:03 102

原创 LeetCode Day6 数组变换+字符串

48 旋转图像题目理解将n*n的二维矩阵,顺时针旋转90°,输出旋转后的矩阵。要求直接修改输入的矩阵,即不增加额外的空间复杂度。思路①可以观察到,数组顺时针旋转后,第i行元素成为第n-1-i列元素,原先在第几列现在就在第几行。即:(i,j)->(j,n-1-i),以此类似,原先为(j,n-1-i)的元素变为(n-1-i,n-1-j),接着(n-1-i,n-1-j)->(n-1-j,i)->(i,j),一次循环结束。每次变化4个值,总循环的次数为n^2/4。②第二种思路是先把数组上

2021-03-07 20:14:04 89

原创 LeetCode Day5 旋转数组+二维数组遍历

189 旋转数组题目理解给定k和数组nums,数组元素循环右移k。思路①扩展数组,将长度n->2n,则右移后的数组元素为n+k,需要注意的是k可能大于n,考虑元素右移n后,位置并不会发生变化,因此实际右移后的位置为k%n。这样,右移结束后,只需把下标为n及以后的元素移到数组前即可。② ①的方法增加了额外的空间,为减少空间复杂度,考虑直接在原数组中进行右移。假设当前为i位置,右移后的位置为i+k,显然直接将nums[i]的值赋给nums[i+k],会影响nums[i+k]的右移,因此需要考虑把

2021-03-06 19:54:43 260

原创 LeetCode Day4 数组的改变、移动+二维数组

274.H指数题目理解给定研究者的论文引用数数组。H指数是指N篇论文中有H篇被引用了至少H次,其余N-H篇不超过H次。说白了就是统计数组中符合条件的那个最大值。举个例子,引用数组为[3,0,6,1,5],引用数>=0的有5篇,符合(0,0)条件;引用数>=1的有4篇。符合(1,1)条件;引用数>=2的有3篇,符合(2,2);引用数>=3的有3篇,符号(3,3);引用数>=4的有两篇,不符合(4,4)。解题思路①开始时考虑对数组进行从大到小排序,则排序后数组下标+1就相当

2021-03-05 22:15:41 231

原创 LeetCode Day3统计数组中的元素

448 找到所有数组中消失的数字题目理解数组元素在1~n范围内,找到所有缺少的数字。要求不使用额外空间且时间复杂度为O(n)。思路最简单的方法是建立map,将1~n每个数字出现的次数存在map中。考虑不使用额外空间,则需要给已经出现的数字一个标记。类似上文,遍历数组,令a[i]位置的元素取负,当遇到重复元素时,a[i]位置的元素仍为负数,不执行操作,因此最终缺少的元素,以此为下标的数组元素必为正数。代码class Solution {public: vector<int>

2021-03-04 20:10:08 200 2

原创 LeetCode Day2 统计数组中的元素

题目:645、697645 错误的集合理解题意:数组中包含1~n,缺一个,有一个数字重复。eg:nums=[1,2,2,4],重复的数字为2,缺少的数字为3。要注意数组是无序的解题思路①将数组中数字出现的次数存在map中,次数为0即为缺少的数;次数为2,为重复的数。②学到的一种新思路,使用异或。个人理解,相同的数字异或结果为0,所以把题目数组nums的所有数与原本的1~n异或,相同的为0,剩下的就只有重复的数字和缺少的数字的异或结果,用xor表示。接下来需要考虑的就是怎么把这两个数分开。以2^4

2021-03-03 20:39:36 170 1

原创 LeetCode题解 Day1数组的遍历

题目编号:485、495、414、628485 最大连续1的个数思路:刚开始的想法是计算当前连续1的个数,然后更新最大连续1的个数,具体的实现,就是在当前数组值为1时,计数且更新最大个数,如果当前数组值为0,将当前连续1个数置0,继续循环。代码如下:class Solution {public: int findMaxConsecutiveOnes(vector<int>& nums) { int cnt=0,max=0; for(int

2021-03-02 19:47:18 199

空空如也

空空如也

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

TA关注的人

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