![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
刷题笔记
黑化草莓熊
交叉学科研究生,机械、仪器、化工、医疗、软件开发,日常分享
展开
-
力扣 2.两数相加 989. 数组形式的整数加法 通用思想模板
整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。例如,对于 num = 1321 ,数组形式是 [1,3,2,1] 。给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 。 思路: 没走完就填当前数,走完填0, 和 = 当前值A+当前值B+进位 迭代:进位 = 和/10 ;返回值当前位=和%10 2. 两数相加给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个原创 2022-07-12 14:07:41 · 190 阅读 · 0 评论 -
力扣54 59 2326 885 螺旋矩阵[中等](优雅解法)
一文搞定螺旋矩阵类问题原创 2022-07-11 22:05:19 · 353 阅读 · 0 评论 -
力扣34在排序数组中查找元素的第一个和最后一个位置(二分法哈希表法)
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 思路:数组时有序的,所以可以使用二分法,在区间[i,j]中找到target第一次出现的位置(左边界),和最后一次出现的位置(右边界) 左边界:由于是有序数组,从原创 2022-07-05 17:33:22 · 308 阅读 · 0 评论 -
力扣295.数据流的中位数[困难]
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构: 解法一:堆实现(B大顶堆和S小顶堆分别存放小数、大数) 分析:使用优先队列保持有序结构,设元素总数为 N = m + n ,其中 m 和 n 分别为 S和 B 中的元素个数。解法二:有序队列+双指针 我们把有序集合看作自动排序的数组,使用双指针指向有序集合中的中位原创 2022-07-02 12:04:35 · 291 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径||力扣113. 路径总和 II
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。分析: 要找从根节点到叶子节点的数值和等于目标值,难免要遍历所有节点,使用深度优先遍历(DFS),从头遍历到为,只要达到目标值就,存储为数组,遍历结束,即可返回结果程序中使用了sum累减直至等于0区判断,也可以使用累加,达到目标值class Solution {public: vecto...原创 2022-05-16 00:01:50 · 221 阅读 · 0 评论 -
剑指 Offer 32 . 从上到下打印二叉树
(1) 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。分析:层序遍历class Solution {public: vector<int> levelOrder(TreeNode* root) { vector<int> res; if(root==nullptr) return res; queue<TreeNode*> que; que.push(root原创 2022-05-15 22:55:04 · 256 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树 ||力扣101. 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。分析:这个树是否为轴对称的,只需要检验,这棵树的左右子树是否是相同的即可class Solution {public: bool isSymmetric(TreeNode* root) { if(root==nullptr)return true; return recur(root->left,root->right); } bool recur(TreeNode* .原创 2022-05-15 15:33:27 · 166 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像||力扣226. 翻转二叉树
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。分析:该题比较简单,在该节点及左右节点存在的情况下只需要交换当前节点的左右节点,循环迭代即可方法一:递归法根据二叉树镜像的定义,考虑递归遍历(dfs)二叉树,交换每个节点的左 / 右子节点,即可生成二叉树的镜像。递归解析:终止条件:当节点 root 为空时(即越过叶节点),则返回 null ;递推工作:...原创 2022-05-15 14:32:27 · 239 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。方法一(DFS深度优先前序遍历,迭代)分析:既然是要找到A树中是否有B树这样子树,即找到A树中的子结构nA,判断其和B树相同,可以分为两个步骤:(1)遍历A树找到一个节点nA,其节点和树B的头节点相同,如果找不到nA,就说明,B树不是A树的子结构(2)(递归)将nA与B树进行节点遍历,检查所有节点是否相同具体做法:step 1:...原创 2022-05-15 13:50:04 · 117 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 1:输入:m = 2, n = 3, k = 1输出:3示例 2:输入:m = 3原创 2022-05-14 16:29:29 · 93 阅读 · 0 评论 -
剑指 Offer 12|| 力扣79. 单词搜索||矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。提示:m == board.lengthn = board[i].length1 <= m, n <= 61 <= word.length <= 15board 和 word原创 2022-05-14 14:49:04 · 153 阅读 · 0 评论 -
剑指 Offer 60. n 个骰子的点数
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。原创 2022-03-24 14:34:07 · 121 阅读 · 0 评论 -
剑指 Offer 49. 丑数 || 力扣 264. 丑数 II
思路:做题之前,要知道什么是丑数,按照百度百科的说法是,1和2,3,5他们的倍数x属于1到无穷大,他们的集合就是{1,5*x,2*x,3*x},有一点丑数必须由一个丑数和另一个因子相乘得到,如7,14不是丑数丑数的性质: 丑数只包含因子 2, 3, 5,因此有 “丑数 == 某较小丑数 × 某因子” (例如:10 =5×2)。得出这么些丑数不是难点,难点是:精准的去重(举例x =3 ,5*3=15,当x=5,3*5 =15;随着遍历会得到两个15),取出第n个大的丑数方法一:最小堆...原创 2022-03-23 20:27:33 · 966 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串 || 力扣3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。方法一:动态规划+哈希表//使用动态规划+哈希表//状态定义:dp[j]为以s[j]字符结尾的最长字符字串的长度,dp[j-1]是以s[j-1]为结尾的字符字串的长度//转移方程:i是满足s[i]=s[j]的,且最靠近j的角标,现在就需要比较j和i之间的差值,来判断dp[j-1]所囊括的子字符串是否将s[i]包含在内// if dp[j-1]<j-i;说明以s[j]字符结尾的最长字符字串的长...原创 2022-03-23 15:32:48 · 891 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值
class Solution {public: int maxValue(vector<vector<int>>& grid) { int m = grid.size(); int n = grid[0].size(); vector<vector<int>> dp(grid); for(int i=0;i<m;i++){ for(in...原创 2022-03-19 10:47:57 · 319 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
方法一:字符串遍历理解:动态规划讲究从后往前推,想知道12258几种翻译方式需要如下思考12258有几种翻译方式,5和当前位置8能否组成对应字母,这里引出形成字母的条件 组成的数字x必须满足10<=x<=25,小于25很好想,101>>这里的01是不能组合成新字母的;这里58不满足这个条件,不能新增翻译方式,所以12258的翻译方法数量上与1225一致 1225有几种?2和当前位置满足新的翻译条件。。。。class Solution {p...原创 2022-03-19 10:46:03 · 423 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。原创 2022-03-19 10:43:09 · 875 阅读 · 0 评论 -
剑指 Offer 19.正则表达式匹配
方法一:动态规划法class Solution {public: bool isMatch(string s, string p) { s=" "+s;//防止该案例:""\n"c*" p=" "+p; int m=s.size(),n=p.size(); vector<vector<bool>> dp(m+1,vector<bool>(n+1,false)); ...原创 2022-03-19 10:40:27 · 583 阅读 · 0 评论 -
剑指 Offer 10-ii. 台阶问题
与题目一基本一致class Solution {public: int numWays(int n) { if(n==0)return 1; if(n==1)return 1; int l =1,r =1,sum =1; for(int i=2;i<=n;++i){ sum = (l+r)%1000000007; l =r; r =sum;...原创 2022-03-19 10:37:26 · 294 阅读 · 0 评论 -
剑指 Offer 10-I. 斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) = 0,F(1)= 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+...原创 2022-03-19 10:34:25 · 364 阅读 · 0 评论 -
动态规划系列题目(整理中)
动态规划维基百科的描述:“动态规划(Dynamic Programming, DP)在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间,动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子...原创 2022-03-17 21:39:07 · 342 阅读 · 0 评论 -
力扣8. 字符串转换整数 (atoi)||剑指 Offer 67. 把字符串转换成整数(刷题笔记)
请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。...原创 2022-03-12 15:37:39 · 170 阅读 · 0 评论 -
剑指 Offer 59 - II. 队列的最大值(刷题笔记)
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若 队列为空,pop_front 和 max_value 需要返回 -1分析:对于普通队列,入队 push_back() 和出队 pop_front() 的时间复杂度均为 O(1) ;本题难点为实现查找最大值 max_value() 的 O(1)时间复杂度。假设队列中存储 N 个元素,从中获取最大值需要遍历队列...原创 2022-03-12 12:50:56 · 735 阅读 · 0 评论 -
剑指 Offer 59 || 力扣239. 滑动窗口最大值 动画题解(刷题笔记)
给你一个整数数组 nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。方法一:单调队列在示例中,我们从数组中第一个元素开始遍历,由于窗口的大小是3,因此当遍历到第三个元素时,窗口就形成了。我们以数组{5, 3, 4, 1},窗口大小k=3来进行说明。这里我们规定窗口右侧边界为right,左侧边界为left,其值为元素下标。然后,开始遍历nums = {5,...原创 2022-03-11 19:47:42 · 194 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串(刷题笔记)
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。class Solution {public: string reverseLeftWords(string s, int n) { int len = s.size(); string res(s); for(int i =0;i<l原创 2022-03-11 15:21:58 · 110 阅读 · 0 评论 -
力扣138 剑指 Offer 35. 复杂链表的复制(刷题笔记)
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。方法一:哈希表 分析:复制一个链表是容易的,复杂链表的难点在于多了一个random指针,指向链表中的任意节点或者null。这个 random 指针意味着在复制过程中,除了构建前驱节点和当前节点的引用指向 pre.next ,还要构建前驱节点和其随机节点的引用指向 pre.random...原创 2022-03-11 13:56:25 · 1124 阅读 · 0 评论 -
力扣 155. 最小栈||剑指 Offer 30. 包含 min 函数的栈(刷题笔记)
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)class MinStack {public: stack<int> stk,stk_min; MinStack() {} void push(int val) { if(stk.empty()){ //stk空,那么stk_min一定还没有值输入 .原创 2022-03-11 11:55:38 · 348 阅读 · 0 评论 -
力扣206||剑指 Offer 24 . 反转链表反转链表(刷题笔记||C++阿里实习面试题)
双指针法(好理解):pre和 cur;pre在前 cur在后。 每次让 pre的 next指向 cur,实现一次局部反转局部反转完成之后 pre和 cur同时往前移动一个位置 循环上述过程,直至 pre到达链表尾部pre->next = cur; cur = pre;纠正绿色第三行class Solution {public: ListNode* reverseList(ListNode* head) { L...原创 2021-11-18 19:11:03 · 771 阅读 · 0 评论 -
*剑指 Offer 20. 表示数值的字符串(刷题笔记)
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。数值(按顺序)可以分成以下几个部分:若干空格一个小数或者整数(可选)一个'e'或'E',后面跟着一个整数若干空格小数(按顺序)可以分成以下几个部分:(可选)一个符号字符('+' 或 '-')下述格式之一:至少一位数字,后面跟着一个点 '.'至少一位数...原创 2022-03-10 15:22:37 · 78 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列(刷题笔记)
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )首先解释一下示例:第一行: ["CQueue","appendTail","deleteHead","deleteHead"] 表示操作CQueue 构造队列 appendTail 队尾入队 deleteHead 队头出队第二行: [[],[3],[],[]] 表示入队的数原创 2022-03-10 14:30:19 · 90 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表(刷题笔记)
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。{{{l链表反转,用数组返回}}}原创 2022-03-09 22:17:06 · 244 阅读 · 0 评论 -
剑指 Offer 05. 替换空格(刷题笔记)
方法一:初始化:空格数量 count ,字符串 s 的长度 len ;统计空格数量:遍历 s ,遇空格则 count++ ;修改 s 长度:添加完 "%20" 后的字符串长度应为 len + 2 * count ;倒序遍历修改:i 指向原字符串尾部元素, j 指向新字符串尾部元素;当 i = j 时跳出(代表左方已没有空格,无需继续遍历);当 s[i] 不为空格时:执行 s[j] = s[i] ;当 s[i] 为空格时:将字...原创 2022-03-08 16:07:03 · 143 阅读 · 0 评论 -
力扣283. 移动零(刷题笔记)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。解法一:快慢指针定义两个index;快指针quick_index指在需要发生移动的位置,即不等于0的位置;慢指针slow_index指在移动好的位置class Solution {public: void moveZeroes(vector<int>& nums) { int n = nums.size(); int quic.原创 2022-01-15 22:57:58 · 152 阅读 · 0 评论 -
力扣 453. 最小操作次数使数组元素相等(刷题笔记)
给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。分析:为了使得每次操作会使得n-1个元素增加1,最终使得所有元素相等》》》 也就相当于,每次操作使得1个元素减少1,最终使得所有的元素相等》》》 即减小到等于最小的那个数为止class Solution {public: int minMoves(vector<int>& nums) { int res = 0;原创 2022-01-12 15:54:11 · 336 阅读 · 0 评论 -
力扣 274. H 指数(刷题笔记)
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 n - h 篇论文每篇被引用次数 不超过 h 次。例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。提示:如果 h 有多种可能原创 2022-01-06 17:05:39 · 534 阅读 · 0 评论 -
力扣 41. 缺失的第一个正数(刷题笔记)
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。方法一:暴力哈希(内存消耗较大)不符合要求哈希表记录每个数字是否出现,C++中可以使用 unorder_map,遍历数组记录每个数字是否出现思路创建一个哈希表;标记nums每个数字出现的次数;如果出现的次数count=0,直接返回class Solution {public: int firstMissingPositive(原创 2022-01-06 15:17:27 · 3603 阅读 · 0 评论 -
力扣 442. 数组中重复的数据(刷题笔记)
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。方法一:哈希法哈希表记录每个数字是否出现,C++中可以使用 unorder_map,遍历数组记录每个数字是否出现思路创建一个哈希表;标记nums每个数字出现的次数;如果出现的次数count=2,直接放到返回数组里面cl原创 2022-01-05 19:29:18 · 3379 阅读 · 0 评论 -
力扣 448. 找到所有数组中消失的数字(刷题笔记)
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。方法一:空间复杂度O(n)哈希表记录每个数字是否出现,C++中可以使用 unorder_map,遍历数组记录每个数字是否出现思路创建一个哈希表;标记nums每个数字出现的次数;如果出现的次数count=0,那这个数字一定是缺失的,直接放到返回数组里面class Solution {public:原创 2022-01-05 14:21:24 · 355 阅读 · 0 评论 -
力扣 697.数组的度(刷题笔记)
给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。class Solution {public: int findShortestSubArray(vector<int>& nums) { int len = nums.size(); unordered_map<int原创 2022-01-04 23:01:30 · 213 阅读 · 0 评论 -
力扣 645.数组错误的集合(刷题笔记)
集合 s 包含从 1 到n的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。给定一个数组 nums 代表了集合 S 发生错误后的结果。请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。方法一:哈希表重复即出现2次,丢失即找不到,只有0次class Solution {public: vector<int> findErrorNums(vector<i...原创 2021-11-29 21:06:54 · 333 阅读 · 0 评论