- 博客(106)
- 收藏
- 关注
原创 Leetcode——剑指 Offer 05. 替换空格
概述剑指 Offer 05. 替换空格分析这题,如果不限制空间复杂度,其实很简单,直接开一个新的string就可以实现了但是,如果要求只能原理处理呢?这里有一个问题需要解决:s --> %20,增加了字符,需要增加striing的容量因为push_back之能最末尾操作思路增加容量可以先遍历一遍string,统计空格的个数,就可以知道最终需要扩充的大小了然后利用resize()来扩充大小代码class Solution {public: s
2022-05-26 22:14:17 300
原创 Leetcode——344. 反转字符串/541. 反转字符串 II/151. 颠倒字符串中的单词/剑指 Offer 58 - II. 左旋转字符串
概述344. 反转字符串541. 反转字符串 II151. 颠倒字符串中的单词剑指 Offer 58 - II. 左旋转字符串这几题都和字符串翻转有关分析344题目要求原地修改,可以考虑使用双指针+swap()函数实现实际上,内置函数reverse()就是通过这个实现;541这题,我们利用reverse()模拟一下操作即可151个人认为这是一个技巧题,要能想到使用多次反转的思路首先翻转整个字符串然后在对每个单词进行一次翻转,即可实现最终效果这里有
2022-05-24 11:13:39 292
原创 Leetcode——1. 两数之和/15. 三数之和/18. 四数之和/ 454. 四数相加 II
概述1. 两数之和15. 三数之和18. 四数之和这三题可一起分析这种【多数之和】问题454. 四数相加 II四数之和的另一种形式分析1两数之和比较简单,暴力就直接两种循环就可以了,复杂度是O(N2)O(N^2)O(N2)实际上,第二重循环是寻找特定的元素,所以我们可以用一个map,利用key值来记录数组中包含的所有元素,进而可以直接替代循环直接找到所需的元素当然,我们还可以先将数组排序,然后利用双指针,分别从头、尾开始移动,可以直接确定两个元素;但是,排序的复杂
2022-05-17 22:27:49 286
原创 Leetcode——202. 快乐数
概述202. 快乐数分析注意题目所给的定义的第2点,已经暗示我们可能出现无限循环的情况所以,如果在模拟计算【快乐数】过程中,出现了重复的值,那么就说明陷入的无限循环,此时需要及时跳出循环,输出结果我们可以考虑使用一个集合来保存在计算过程中出现的所有的值,然后每次判断新计算的值是否在其中。如果在其中,说明循环,可判断结果思路集合数据结构选择?因为不需要排序,所以可以使用unordered_set代码class Solution { public: bo
2022-05-10 22:24:41 300
原创 Leetcode——349. 两个数组的交集/350. 两个数组的交集 II
概述349. 两个数组的交集350. 两个数组的交集 II分析349题目要求寻找带个数组中元素的交集,并且最后输出唯一的值此题的交集才真正的符合数学上的交集同样,可以使用哈希表统计350350和349的区别在于最终返回的结果要输出重复元素在两个数组中出现的最少次数可以和349一样使用哈希表来确定重复的元素,但是key对应的value的赋值应该有所不同思路代码349class Solution {public: vector<int> inters
2022-05-09 22:06:38 343
原创 Leetcode——438. 找到字符串中所有字母异位词
概述438. 找到字符串中所有字母异位词找到 s 中所有 p 的 异位词 的子串分析首先,题目要求我们找出s中的满足条件连续子串,根据之前刷题,连续子串问题可以考虑使用滑动窗口解决思路窗口移动的过程中何时记录结果?因为题目要求寻找的子串要求是p的异位词子串,所以当窗口内的子串是p的异位词时,就可以记录结果而判断异位词可以选择哈希表来解决代码class Solution {public: bool judge(int hash_table[30]) {
2022-05-05 22:05:35 260
原创 Leetcode——49. 字母异位词分组
概述49. 字母异位词分组所有源单词中的字母通常恰好只用一次。分析此题是在一个字符串数组中,找多对符合结果的列表我们可以延续之前的【242. 有效的字母异位词】的思路,统计每个字符串的字母的情况,然后利用二重循环遍历去判断字符串的情况是否相同这样,时间复杂度是O(N2)O(N^2)O(N2)。注意到,题目的数据字符串数组的长度可到10410^4104,所以如果用这种方法,很有可能会超时,所以不能使用判断两个字符串是否为字母异位词,除了可以利用哈希表保存每个每个字符串的字母情况之
2022-05-04 12:13:40 286
原创 Leetcode——383. 赎金信
概述383. 赎金信分析根据题目提示: 判断 ransomNote 能不能由 magazine 里面的字符构成,并且magazine 中的每个字符只能在 ransomNote 中使用一次所以我们需要统计ransomNote和 magazine 中每个字符出现的次数,然后比较每个字符次数是否相同即可这里,每个字符只能使用一次的条件,是可以直接判断通过字符出现次数来判断的关键统计每个字符的次数可以使用哈希表来思路哈希表是直接使用数组还是用map?因为我们只需要统计小写字母的个
2022-05-03 22:22:10 517
原创 Leetcode——242. 有效的字母异位词
概述242. 有效的字母异位词分析根据题目提示: s和t中每个字符出现的次数都相同,则称 s和 t互为字母异位词;所以我们需要统计s和t中每个字符出现的次数,然后比较每个字符次数是否相同即可统计每个字符的次数可以使用哈希表思路哈希表是直接使用数组还是用map?因为我们只需要统计小写字母的个数。一小写字母个数是有限的而且一个字符可以也可以转换为专用的整数,所以完全可以选择使用数组充当哈希表代码class Solution {public: bool isAnagr
2022-05-03 22:18:38 368
原创 Leetcode——142. 环形链表 II
概述142. 环形链表 II分析技巧类的题目该题可以分为两步:确定链表是否有环; —> 快慢指针法确定环的起始结点(x+y)*2=(x+y)+n(y+z) //这里n(y+z)是快指针多走的,n代表多做圈数x=n(y+z)-y=(n-1)(y+z)+z //x是我们要求的注意到(n-1)(y+z)是环的长度,也就是说,x的长度 = 从指针相遇位置开始的n-1圈 + z那么 一个指针A从头结点开始,一个指针B从相遇结点开始,同时移动,A会一直向前,B会在环内一直转
2022-05-01 21:50:12 236
原创 Leetcode——面试题 02.07. 链表相交
概述面试题 02.07. 链表相交 分析技巧类的题目利用两个指针,分别指向两个链表同步移动,但是起始位置不同见代码分析思路代码class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *work_ptr = headA; int size_A = 0; // 计算两个链表的长度
2022-05-01 21:44:44 591
原创 Leetcode——19. 删除链表的倒数第 N 个结点
概述19. 删除链表的倒数第 N 个结点分析这种题目,算是技巧题,见过一次就知道怎么做了,所以也不太好分析是怎么想到利用双指针来找倒数第N个元素这也是为什么我们需要多刷题的原因,有些题目真的没见过确实比较难想而因为要删除元素,所有仍然需要虚拟头结点来统一可能对原链表头结点的删除操作思路双指针思路?利用两个指针,保持固定的距离N同步移动,当后面的指针到达链表末尾时,前面指针的位置就是倒数第N个位置代码class Solution {public: ListNo
2022-04-30 18:54:15 311
原创 Leetcode——203. 移除链表元素/707. 设计链表/206. 反转链表/24. 两两交换链表中的节点
概述203. 移除链表元素707. 设计链表206. 反转链表24. 两两交换链表中的节点上述四个题目,算法的技巧都在建立虚拟头结点,来统一操作分析对于链表来说,头结点相当于其他结点处在一个特殊位置:其他结点都有前、后结点(尾结点的后结点时NULL),而头结点确没有前结点所以,经常会需要额外考虑头结点的处理为了同一操作,可以为原始链表添加一个虚拟头结点,指向原始头结点,使得对于原始链表来说,所有结点都是一样的结构,用于前、后结点思路如何添加虚拟头结点?List
2022-04-29 22:31:08 628
原创 Leetcode——54. 螺旋矩阵/59. 螺旋矩阵 II
概述54. 螺旋矩阵59. 螺旋矩阵 II分析两个题目类似,实现的关键在于如何模拟遍历的顺序根据题目要求,遍历的顺序为:从左到右;从下到上;从右到左;从下到上,我们需要模拟该操作;需要注意的是,我们要固定区间取值的规则,即选择左闭右开,还是左闭右闭如果我们使用左闭右开,我们模拟一下示例1,发明正中间的5最后是无法遍历到的实际上,只要无法完整的循环走完一圈,一定会有一个元素无法遍历到,所以需要额外处理最后可能没有完整一圈的情况比如说,最后一圈不完整,假设是1 2 3,则3这个
2022-04-26 18:50:57 405
原创 Leetcode——76. 最小覆盖子串
概述76. 最小覆盖子串注意题目给出的两点限制分析根据示例,我们可以知道要求的是一个满足条件的连续子串限制1告诉我们是找最小连续子串问题因此考虑滑动窗口思路双指针实现滑动窗口思路?见代码部分代码class Solution {public: string minWindow(string s, string t) { unordered_map<char,int> unordered_map_char_to_int;
2022-04-24 18:08:27 1626
原创 Leetcode——904. 水果成篮
概述904. 水果成篮题目有点啰嗦,主要注意第二个规则分析根据规则2,我们可以知道,一旦选择了一颗果树开始,则后面连续出现的果树被必须采摘,实际上就是一个求满足条件的连续子数组问题因此,我们根据之前的分析总结,考虑采用滑动窗口解决该问题思路双指针实现滑动窗口思路?见代码部分代码class Solution {public: int totalFruit(vector<int>& fruits) { int result =
2022-04-24 18:07:18 110
原创 Leetcode——904. 水果成篮
概述904. 水果成篮题目有点啰嗦,主要注意第二个规则分析根据规则2,我们可以知道,一旦选择了一颗果树开始,则后面连续出现的果树被必须采摘,实际上就是一个求满足条件的连续子数组问题因此,我们根据之前的分析总结,考虑采用滑动窗口解决该问题思路双指针实现滑动窗口思路?见代码部分代码class Solution {public: int totalFruit(vector<int>& fruits) { int result =
2022-04-22 14:25:16 1430
原创 Leetcode——209. 长度最小的子数组
概述209. 长度最小的子数组分析首先看清题目要求:找满足条件的长度最小的连续子数组因为要求连续子数组,当某个子序列满足条件时,如果再继续往后加入新的元素,一定也满足和>=target,但此时就不是最短子序列了所以,一旦某个子序列满足条件,就不需要继续向后查找了我们知道,一个子序列有起始位置和终止位置,如果根据暴力,则利用两层循环,先确定起始位置,然后终止位置遍历向后移动,直到首次满足条件,说明找到该起始位置的最短的满足条件的子数组,然后换下一个起始位置再继续,重新开始遍历终止位
2022-04-21 22:56:33 345
原创 Leetcode——977. 有序数组的平方
概述977. 有序数组的平方分析给出的数组按非递减排序,要求返回 每个数字的平方 组成的新数组,并且新数组也要按非递减排序根据题目下面的示例,我们可以知道,数组中存在正值和负值虽然无法确定原数组元素平方后的最小值,但是我们容易得到最大值一定在原数组的两端,所以我们可以利用双指针,一个指向首部,一个指向尾部,比较这两个元素平方后的大小,来确定平方后的数组的最大值,之后一直按照这个思路进行就行,直到两个指针交错思路双指针实现思路?见代码部分代码class Solution {pub
2022-04-21 19:14:08 805
原创 Leetcode——844. 比较含退格的字符串
概述844. 比较含退格的字符串分析题目类型仍然可以看作是删除数组元素,依然可以考虑双指针需要对每个数组单独处理,所以可以将双指针删除元素的操作提取成一个函数,完成后,比较删除后两数组是否相等即可思路双指针实现思路?见代码部分代码class Solution {public: int deal_string(string &s, int slow_index = 0, int fast_index = 0) { for(; fast_index &
2022-04-21 19:07:01 802
原创 Leetcode——283. 移动零
概述283. 移动零要求原地操作分析同样是原地操作数组进行移动,容易想到使用双指针;题目要求将0移动到数组的末尾且保持非零元素的相对次序,所以每找到一个非0元素,将应该将其交换到数组前面去,最终0也会到数组后面思路双指针实现思路?见代码部分代码class Solution {public: void moveZeroes(vector<int>& nums) { int slow_index = 0, fast_index = 0
2022-04-20 12:20:02 552
原创 Leetcode——26. 删除有序数组中的重复项
概述26. 删除有序数组中的重复项要求原地删除分析题目要求移除有序数组重复出现的元素,且要求原地删除,可以想到STL函数unique(),而该函数也是通过双指针实现的思路双指针实现思路?使用两个指针,一个指针指向合法序列的最后一个位置,另一个序列用来遍历合法序列之后的元素;如果找到在后面找到一个合法元素,则加入前面的合法序列中去,直到找完全部的数组这里为什要这样解释两个指针的含义,在后面【代码-考虑】部分解释代码class Solution {public:
2022-04-19 18:25:57 264
原创 Leetcode——27. 移除元素
概述27. 移除元素题目要求原地操作分析对于移除数组中的元素,并且要求原地操作,题目已经给出了实现思路,就是将不符合条件的值移到数组后面去可以利用双指针实现O(N)O(N)O(N)算法 或 直接使用STL函数remove()来实现分析remove()源代码,内部也是通过双指针来实现的思路双指针实现思路?使用两个指针,一个指针指向合法序列后的下一个位置,另一个序列用来遍历合法序列之后的元素;如果找到在后面找到一个合法元素,则加入前面的合法序列中去,直到找完全部的数组
2022-04-18 22:34:58 395
原创 Leetcode——367. 有效的完全平方数
概述367. 有效的完全平方数完全平方数:可以写成一个整数的平方的数分析这题和 69. x 的平方根 思路类似,只是返回值不同可参考我的blog有分析过程因为要求是完全平方数,如果能找到就返回true,否则返回false思路二分思路?略代码class Solution {public: bool isPerfectSquare(int num) { if (num == 1) return 1; int L = 0, R
2022-04-18 22:23:24 289
原创 Leetcode——69. x 的平方根
概述69. x 的平方根 注意,返回的类型是整数,小数部分被舍去分析对于找x的平方根,我们很容易想到从[1, x)去尝试,即暴力求解但是注意到[1,x)是一个有序数组,问题就变成了在一个有序数组寻找一个满足条件的值,那么容易想到二分法因为返回的类型是整数,所以也会有找不到的情况,需要额外考虑思路二分思路?略当x的平方根为小数时,无法直接在整数数组中找到值,如何确定返回值呢?首先,当我们二分找不到元素,失败时一定有L > R;这种情况下,可能是当L=
2022-04-18 22:08:46 144
原创 Leetcode——34. 在排序数组中查找元素的第一个和最后一个位置
概述34. 在排序数组中查找元素的第一个和最后一个位置分析题目要求时间复杂度O(logN)O(logN)O(logN),并且给出的是一个有序数组中插入目标值的问题,容易想到使用二分法但是注意到下的示例中,数组中可以有重复元素的,所以当你每次二分查找到target时,左右两边都有可能还有target,所以对两边应该继续使用二分法思路二分思路?略如何实现左右两边继续二分?首先,因为不知道要向两边查找多少次,为了避免代码重复,应该考虑将二分的代码提取出来然后,因为每次有二分
2022-04-18 12:10:32 390
原创 Leetcode——35. 搜索插入位置
概述35. 搜索插入位置分析题目同样给出一个有序数组,然后也是在其中查找target,只是多了一个查找失败的要求对于一个有序数组的查找问题,很容易想到二分法;并且题目也说明数组中的元素不重复,所以不需要考虑重复元素的情况思路二分思路?略如果查找失败,如何确定插入的位置呢?首先,当我们二分找不到位置,失败时一定有L > R;这种情况下,可能是当L==R时,由于L移动引起的,也可能是由于R移动引起的,我们需要分一下L==R的情况:如果由L向后移动引起,则说明
2022-04-17 18:16:26 256
原创 Leetcode——704. 二分查找
概述704. 二分查找分析题目说明数组是有序的,然后又是一个查找问题,很容易想到二分法思路如何实现二分法?这里不详述,基本上有模版代码实现class Solution {public: int search(vector<int>& nums, int target) { int L = 0 , R = nums.size() - 1; while (L <= R) { int mid = (
2022-04-16 22:16:32 426
原创 Leetcode——665. 非递减数列
概述题目链接对于一个序列,要求最多改变1个元素,使得序列满足非递减排列分析题目要求序列满足非递减排列,当出现num[i]>=num[i+1]num[i]>=num[i+1]num[i]>=num[i+1]时,一定要改变一个元素;但是改变的元素的值应该尽可能使得不符合非递减的情况出现的概率要低想到这里,考虑贪心策略思路当出现num[i]>=num[i+1]num[i]>=num[i+1]num[i]>=num[i+1],有两种处理方
2022-04-15 23:03:06 392
原创 Leetcode——153. 寻找旋转排序数组中的最小值
概述题目链接局部有序数组内查找最小元素,数组内值互不相同分析要求O(logn)O(logn)O(logn),说明还是需要二分法,并且局部有序也是支持二分操作的思路Q1:如何确定下一个查找区间?我们每次得到的值是num[mid],我们想要查找的值是min。由左图可知,当mid在1处时,应该查找右区间;当mid在2处时,应该查找左边区间Q2:如何确定mid的位置?通过分析,num[mid]可以和num[l]或num[r]比较如果和num[l]比较,num[mid]>
2022-04-14 23:51:47 306
原创 Leetcode——542. 01 矩阵
概述题目链接题目没有需要注意的地方分析BFS因为要求最近距离考虑使用BFS动态规划如果不是刷题的时候,写到这题的专题是动态规划,估计不会想到动态规划算法dp[i][j]:mat[i][j]离0最近的距离dp[i][j]={1+min(dp[i+1][j],dp[i−1][j],dp[i][j+1],dp[i][j−1]),if mat[i][j] = 10if mat[i][j] = 0dp[i][j] = \begi
2022-04-12 21:55:34 203
原创 Leetcode——413. 等差数列划分
概述题目链接注意:题目要求连续子数组个数至少有3个元素,但是数据只确保>=1,所以可以特殊处理一下分析暴力解枚举所有长度大于 2 的连续子数组,如果是等差数列,给计数器加 1双指针——滑动窗口法左指针指向所有包含该元素的符合条件的等差子数组右指针开始移动,确定等差数组的差值,只有后面一个数字满足该差值,就可以组成一个子数组,结果加1如果右指针指向的数字不满足之前的差值 或 指向的数组的末尾,则说明包含左指针元素的所有等差子数组已经找完,于是移动左指针,继续操作动态规划不同
2022-04-11 22:14:16 550
原创 c++语法:cin.get()/getchar()/cin.getline()/gets()/getline()用法
读取单个字符cin.get()char c;cin.get(c);getchar()char c;c = getchar()都能读取空格等特殊字符建议使用cin.get(),效率高读取字符数组cin.get(c,num)char c[20];cin.get(c,20); // 20用来限制接收字符的数目可以接收空白符,遇到回车结束cin.getline()cin.getline(字符数组,接收个数,结束字符)可以接收空格等;结束符可以通过设置第三个参数自己
2022-04-09 21:02:20 1077
原创 Leetcode——76. 最小覆盖子串
概述题目连接注意:要求时间复杂度为O(n)O(n)O(n)分析要求O(n)O(n)O(n),并且结果也是一个连续的字符串,所以考虑使用双指针进行区间搜索思路滑动窗口思路?首先固定左边界,然后右边界开始向右滑动向窗口中加入元素当所有所需的字符加入窗口后,此时右边界是最小的,但是左边界不一定,所以可以移动左边界,将字符移出去的同时继续使窗口满足条件直到因为左边界移动导致该窗口不满足条件,则停止移动左边界,继续移动右边界重复以上行为,直到右边界到达最后位置代码class So
2022-04-08 21:25:20 396
原创 Leetcode——310. 最小高度树
概述题目连接选择树中任何一个节点作为根,求可以构造最小高度的树的根节点的结点编号分析搜索法根据题目,容易想到通过选择不同的结点来构造树,然后利用树的层次遍历(即BFS)来获得该树的高度结论法实际上,该题是个结论题,需要一定的背景知识结论:设 $\textit{dist}[x][y] 表示从节点x到节点y的距离,假设树中距离最长的两个节点为表示从节点 x到节点 y的距离,假设树中距离最长的两个节点为表示从节点x到节点y的距离,假设树中距离最长的两个节点为 (x,y)$,它们之间的距离为
2022-04-07 22:53:22 423
原创 Leetcode——33. 搜索旋转排序数组
概述题目链接数组局部有序,且没有重复值,查找是否有某个值分析数据局部有序查找,也可考虑二分方法,但每次需要判断下一个查找的区间思路如何判断下次查询的区间?当num[mid] != target,无论是大于 or 小于,我们都需要考虑mid的位置,而且都是两种情况如果mid在左半部分有序数组中;如果mid在右半部分有序数组中;判断的方法是:if (num[0] <= num[mid]) // mid在前一部分else // mid在后一部分
2022-04-06 15:50:25 1090
原创 Leetcode——37. 解数独
概述题目链接题目意思非常清楚,不需要额外解释分析该题,容易想到需要使用回溯法解回溯法基本思想这里不再解释,可以结合DFS理解思路如何确定每个位置可以填入的值?一种思路是利用函数,每次去判断列、行、小方格内的数字情况令一种思路是使用三个哈希数组,分别记录每列、每行、每个小方格内的使用数字情况大部分情况下,我们优先时间,所以选择方法二回溯的起点在哪?从任意一个空位置开始即可代码class Solution {public: //
2022-04-05 20:30:54 576
原创 LeetCode——126. 单词接龙 II
概述题目地址题目不难理解,这里不需要额外解释分析首先 题目要求寻找最短转换序列,那么我们容易想到使用BFS搜索BFS思路这里不在介绍沿着BFS搜索考虑代码编写,问题在于如何正确保存获取目标单词的路径,有以下问题:BFS利用队列保存,每次遍历一个level,那么如果在找到目标单词前,实际上可能每层的结点并不是都用的...
2022-04-03 20:10:09 1168
原创 5.MySQL数据库DQL操作
文章目录MySQL数据库DQL操作基本知识语法SQL执行顺序数据库的列(表达式)Where条件字句逻辑运算符模糊查询:比运算符联表查询Join自连接分页和排序排序分页子查询和嵌套查询Group byMySQL数据库DQL操作基本知识DQL(数据库查询语言):用于查询数据库数据select语法SELECT <ALL | DISTINCT> -- 是否去重{* | [table.field1[as alias1][,table.field2[as alias2]][,...
2021-10-26 22:51:36 468
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人