![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer总结
pppppppyl
一定要爱着点儿什么,恰似草木对光阴的钟情。
展开
-
剑指 Offer 11. 旋转数组的最小数字
题目链接:leetcode.二分法搞了半天没整明白,用暴力找/*执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户内存消耗:11.9 MB, 在所有 C++ 提交中击败了18.10%的用户*/class Solution {public: int minArray(vector<int>& numbers) { int N = numbers.size(); for(int i = 0;i < N - 1;+原创 2021-07-29 17:24:25 · 39 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
题目链接:leetcode.以为是每行都大于上一行的二分法了,实际上可以用O(N + M)的时间复杂度,从左下角开始查找,大于target就上移,小于target就右移。/*执行用时:20 ms, 在所有 C++ 提交中击败了95.07%的用户内存消耗:12.6 MB, 在所有 C++ 提交中击败了74.92%的用户*/class Solution {public: bool findNumberIn2DArray(vector<vector<int>>&原创 2021-07-28 20:34:36 · 45 阅读 · 0 评论 -
剑指 Offer 66. 构建乘积数组
题目链接:leetcode.不能使用除法了又a.length <= 100000 可以暴力的应该/*43 / 44 个通过测试用例 超时 */ class Solution {public: vector<int> constructArr(vector<int>& a) { int N = a.size(); vector<int> ans(N, 1); for(int i = 0;i原创 2021-03-15 15:07:58 · 94 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先
题目链接:leetcode.递归,返回值为当前节点的子树是否包含p或q1.当前节点为空,则一定不包含,返回false2.当前节点的左右子树都为true,或者,当前节点是p或q 且左右子树有一个为true,则当前节点就是最小公共子节点3.当前节点的子树有true,则返回true,或者当前节点是p或q,也返回true注意:找到的ans是最小公共祖先,因为从叶子节点往上找的,一定是深度最大的,而且找到之后,不会被别的节点刷新,因为ans的子树已经包括了p和q,而ans只能提供一个true值,所以再原创 2021-03-11 19:49:40 · 62 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
题目链接:leetcode.题目中说了,是一棵 二叉搜索树,,我是怎么一回事啊二叉搜索树可以直接找出来到某个节点的路径,从后往前对比路径,第一个相同的就是公共祖先咯O(n) O(n)/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), le原创 2021-03-11 16:55:07 · 50 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
题目链接:leetcode.简单题,我是笨比 ( ̄_ ̄|||)先利用异或^,求a和b每一位的无进位和sum,再利用与&,求取每一位上的进位carry然后将carry左移一位,与求得的sum相加,可以让a等于sum,b等于carry,如此循环,直到没有进位,则返回sum注意,如果carry是有符号数,C++不支持负数的左移,在a = 1,b = -1时,会因为carry算得10000…00 = -2147483648而无法左移runtime error: left shift of negat原创 2021-03-11 15:46:10 · 55 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n
题目链接:leetcode.好可爱啊这个题,断了我所有的后路要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)难道是递归?class Solution {public: int sumNums(int n) { return n + ((n-1) && sumNums(n - 1)); //不对的,逻辑与得到的不是1就是0 }};看题解( ̄▽ ̄)"其实我们原创 2021-03-09 11:39:24 · 102 阅读 · 0 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字
题目链接:leetcode.10^5 感觉是可以用暴力的 emmm不可以,m更大一点O(mn)要超时。好的,又不会→_→,看题解迭代法f(n, m)表示长度为 n的数组每次删除第 m个元素后最终剩下的数字的索引,而我们知道,每次第一个删除的元素索引一定是(m - 1) % n (m可能比 n大),然后剩下 n-1个数;对于这 n-1个数,将他们从索引为 m开始重新排列,又因为 f(n-1, m)表示最后长度为 n-1的数组最后剩下的索引(从0开始),则 f(n, m) = ( f(n-1, m)原创 2021-03-09 09:53:21 · 42 阅读 · 0 评论 -
剑指 Offer 60. n个骰子的点数
题目链接: leetcode.我:这,,不是个数学题嘛 ,脑子不够,回溯来凑提交:11 / 11 个通过测试用例 超出时间限制class Solution { vector<int> tmp;public: void dfs(int index, int sum, int n)//该第index个骰子,之前投的和为sum { if(index == n) { tmp[sum]++;//记录本次投的情况 return; } for(int i =原创 2021-03-08 19:29:54 · 64 阅读 · 0 评论 -
剑指 Offer 59 - II. 队列的最大值
题目链接: leetcode.我愿称其为“大哥之争”啊我绝对做过的啊,可是竟然不知道咋实现了,,提示说用到栈和滑动窗口 (骗子!用大根堆试了下依然不对 ,如果一个数是第二大,被pop的时候会依然留在大根堆中md小破题做了四十分钟都没搞出来 o(TヘTo)用双向队列维护一串单调递减的数,每次队首都是当前最大值,新队员来的时候,如果比队尾的队员大,就将队尾的队员赶走(因为要想新队员离开,当前队中的所有人都得离开,而那些本就比新队员小的数,只要新队员没走,永远不会是max,也就没有意义啦,原创 2021-03-08 15:36:09 · 35 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值
题目链接:leetcode.这题明明是困难!而我只会用暴力,O(nk) ,O(1)/*执行用时:148 ms, 在所有 C++ 提交中击败了16.90%的用户内存消耗:15.2 MB, 在所有 C++ 提交中击败了96.45%的用户 */class Solution {public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { if(nums.empty())原创 2021-03-07 11:56:34 · 44 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
题目链接:leetcode.没把题看清楚就做,(但终于一次写出一个回溯了!!!要求连续的正整数序列,回溯得到的根本不连续鸭class Solution {public: vector<vector<int>> ans; vector<int> tmp; void dfs(int target, int sum, int index) { if(sum > target) { return; } if(sum == targe原创 2021-03-06 20:26:53 · 91 阅读 · 0 评论 -
剑指 Offer 56 - II. 数组中数字出现的次数 II
题目链接: leetcode.我以为这道题不会用哈希表那么简单的。。/*执行用时:40 ms, 在所有 C++ 提交中击败了83.57%的用户内存消耗:18 MB, 在所有 C++ 提交中击败了25.64%的用户 */class Solution {public: int singleNumber(vector<int>& nums) { int N = nums.size(); unordered_map<int, int&g原创 2021-03-04 16:57:37 · 91 阅读 · 1 评论 -
剑指 Offer 56 - I. 数组中数字出现的次数
题目链接: leetcode.妙啊妙,太强了(๑•̀ㅂ•́)و✧要求时间O(n) 空间O(1)一个不同的数是可以通过异或解出来的,两个不同的数可以把这两个数放在不同的组中,这样就又化解为求一个不同的数了。怎么将这两个数分在两个组里,且组内其他数都出现了两次呢?1.全部异或得到两个不同的数的异或值x;2.x的每一位表示,这两个不同的数对应位的异或情况,所以为 1 的位说明这两个数该位一定不同;3.所以可以记录某个为 1 的位,用来分组,与这个位&为 0的数一组,&为 1的数为原创 2021-03-04 15:07:48 · 69 阅读 · 1 评论 -
剑指 Offer 55 - II. 平衡二叉树
题目链接: leetcode.暴力,计算每个节点的左右子树的深度/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ /*执行用时:24 ms, 在所有 C++ 提原创 2021-03-03 17:12:37 · 84 阅读 · 1 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点
题目链接: leetcode./** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; *//*执行用时:28 ms, 在所有 C++ 提交中击败了47.64%的用户内存消耗原创 2021-03-03 15:44:54 · 40 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对
题目链接: leetcode.这种0 <= 数组长度 <= 50000的O(N^2)一般都会超时,下次不用试了/*暴力 超时 35 / 139 个通过测试用例 */class Solution {public: int reversePairs(vector<int>& nums) { int N = nums.size(); int ans = 0; for(int i = 0;i < N;++i)原创 2021-03-02 19:15:28 · 59 阅读 · 0 评论 -
剑指 Offer 49. 丑数
题目链接: leetcode.这道题都做过一遍了喂(#`O′)竟然还是不会!用堆,每次弹出堆顶的数, 将其分别乘以2,3,5压入堆为了避免重复,使用哈希表存放已经生成的数如果存int,在输入1690时溢出:runtime error: signed integer overflow: 429981696 * 5 cannot be represented in type 'int'/*执行用时:160 ms, 在所有 C++ 提交中击败了9.06%的用户内存消耗:33.5 MB, 在原创 2021-03-01 15:07:06 · 131 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串
题目链接: leetcode.hhhhhh暴力时间复杂度 O(n^2)空间复杂度 O(Σ),其中Σ表示字符集(即字符串中可以出现的字符)的大小。在本题中没有明确说明字符集,因此可以默认为所有 ASCII 码在 [0, 128)内的字符,即 Σ=128。 我们需要用到哈希集合来存储出现过的字符,而字符最多有Σ个,因此空间复杂度为 O(Σ)。/*执行用时:1368 ms, 在所有 C++ 提交中击败了5.01%的用户内存消耗:257.9 MB, 在所有 C++ 提交中击败了5.00%的用户*原创 2021-03-01 14:34:58 · 42 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
题目链接:leetcode.还以为用回溯呢。。。没想到是动态规划O(n) 、O(n):/*执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户内存消耗:5.9 MB, 在所有 C++ 提交中击败了73.98%的用户*/class Solution {public: int translateNum(int num) { if(num < 10) return 1; string tmp = to_string(num); int原创 2021-02-28 17:51:01 · 49 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数
题目链接: leetcode题目实质是排序规则的设计:设 nums任意两数字m,n的字符串格式为 x 和 y ,则若拼接字符串 x + y > y + x,则 m > n反之,若 x + y < y + x,则 n < m传递性证明:若字符串 x+y < y+x , y+z < z+y ,需证明 x+z < z+x 一定成立。见题解/*执行用时:8 ms, 在所有 C++ 提交中击败了82.96%的用户内存消耗:11.2 MB, 在所有原创 2021-02-28 16:23:53 · 31 阅读 · 0 评论 -
剑指 Offer 44. 数字序列中某一位的数字
题目链接:leetcode.我能做的。。。class Solution {public: int findNthDigit(int n) { if(n < 10) return n; }};看了大佬题解后:先求出n是在几位数表示范围内1位数9个 以1开头 共占9位2位数90个 以10开头 共占180位3位数900个 以100开头 共占2700位… …再算出n对应的是该范围内的哪一个数字num原创 2021-02-26 12:00:17 · 57 阅读 · 0 评论 -
剑指 Offer 43. 1~n 整数中 1 出现的次数
题目链接: leetcode.无论如何,没思路时一定要想到暴力虽然超时 O(n*log10(n)) O(log10(n))int countDigitOne(int n){ int countr = 0; for (int i = 1; i <= n; i++) { string str = to_string(i); countr += count(str.begin(), str.end(), '1'); } return c原创 2021-02-26 11:15:17 · 52 阅读 · 1 评论 -
剑指 Offer 41. 数据流中的中位数
题目链接: leetcode.排序会超时/*16 / 18 个通过测试用例 */class MedianFinder {public: vector<int> _nums; /** initialize your data structure here. */ MedianFinder() { } void addNum(int num) { _nums.push_back(num); sort(_nu原创 2021-02-24 12:05:12 · 44 阅读 · 0 评论 -
剑指 Offer 40. 最小的k个数
题目链接: leetcode.简单题,这题我做过,要用到优先队列priority_queue<int> 默认 堆顶是堆中最小 大根堆priority_queue<int, vector<int>, greater<int> > 堆顶最大template< class T, class Container = std::vector<T>, class Compare = std::less<typename Contain原创 2021-02-24 11:18:51 · 43 阅读 · 0 评论 -
剑指 Offer 38. 字符串的排列
题目链接: leetcode.回溯模板 * def backtrack(路径,选择列表): * if 满足结束条件: * result.add(路径) * return * for 选择 in 选择列表: * 做选择 * backtrack(路径,选择列表) * 撤销选择当遇到有重复元素求子集时,先对nums数组的元素排序,再用if(i>start&&nums[i]==原创 2021-02-22 18:22:58 · 41 阅读 · 0 评论 -
剑指 Offer 37. 序列化二叉树
题目链接: leetcode.本题的测试的是 序列化 和 反序列化是否可逆,因此序列化列表的形式并未限制,只要两个函数可以互逆就好啦/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} *原创 2021-02-22 18:12:48 · 76 阅读 · 1 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
题目链接: leetcode.本题常见的三种解法:哈希表统计法:遍历数组nums,用HashMap统计各数字的数量,即可找出众数。此方法时间和空间复杂度均为 O(N) 。数组排序法:将数组nums排序,数组中点的元素一定为众数。O(nlogn) O(logn)摩尔投票法:核心理念为票数正负抵消。此方法时间和空间复杂度分别为O(N)和O(1),为本题的最佳解法。排序:/*用了sort,时间复杂度大于O(n)了 执行用时:28 ms, 在所有 C++ 提交中击败了65.81%的用户内原创 2021-02-20 16:53:37 · 50 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表
题目链接: leetcode.二叉搜索树的中序遍历是递增数列中序遍历时,记录上一个节点pre,即为当前节点左边紧邻的节点,更新指针后遍历下一个节点(root->right),同时pre指向当前节点。注意head节点的确定(没有pre节点)注意结束时头尾节点相连/*// Definition for a Node.class Node {public: int val; Node* left; Node* right; Node() {}原创 2021-02-20 10:50:12 · 57 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制
题目链接: leetcode.错误思路,修改了原来的列表指针[[7,null],[13,0],[11,4],[10,2],[1,0]]Next pointer of node with label 7 from the original list was modified./*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node(in原创 2021-02-19 12:30:35 · 854 阅读 · 1 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
题目链接:leetcode.这题我做过,,113. 路径总和 II知道是用回溯但我一通乱写:class Solution {public: vector<vector<int>> ans; vector<int> tmp; void dfs(TreeNode* root, int sum, int now) { if(root == nullptr || now > sum) { if(now > sum)原创 2021-02-18 11:36:30 · 43 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
题目链接:leetcode.二叉搜索树后序遍历 [左子树 | 右子树 | 根节点]且左子树都小于根节点,右子树都大于根节点左右子树内部依然满足这样的条件所以使用递归:/*执行用时:4 ms, 在所有 C++ 提交中击败了49.55%的用户内存消耗:6.7 MB, 在所有 C++ 提交中击败了95.77%的用户 */class Solution {public: bool isPostorder(vector<int>& postorder, int start,原创 2021-02-18 10:44:56 · 65 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II
题目链接: leetcode.简单题,我第一反应竟然是用两个队列/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; *//*执行用时:8 ms, 在所有 C++ 提交中原创 2021-02-17 14:38:48 · 53 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列
题目链接: leetcode.借助辅助栈模拟入栈出栈入栈操作: 按照压栈序列的顺序执行。出栈操作: 每次入栈后,循环判断 “栈顶元素 == 弹出序列的当前元素” 是否成立,将符合弹出序列顺序的栈顶元素全部弹出。前提:栈的所有数字均不相等!!!/*执行用时:24 ms, 在所有 C++ 提交中击败了13.65%的用户内存消耗:14.8 MB, 在所有 C++ 提交中击败了68.35%的用户*/ class Solution {public: bool validateStack原创 2021-02-17 11:39:20 · 49 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈
题目链接: leetcode.本以为是个简单题我指定能行。。。结果error: cannot use dot operator on a type想在函数里面用变量,,是要把变量定义到class下面的还试图用一个int对象表示最小值应该用一个栈来存放当前最小值,当最小值弹出时栈也弹出, 最小栈顶变成次小值/*执行用时:32 ms, 在所有 C++ 提交中击败了63.14%的用户内存消耗:14.6 MB, 在所有 C++ 提交中击败了92.00%的用户*/class MinStac原创 2021-02-17 11:01:47 · 1160 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
题目链接: leetcode剑指offer思想:1.创建一个辅助函数判断B是否是A的子结构(A是否包含B)2.递归遍历A树的每一个节点作为根结点和B树进行比较A或B为空则不是子树直接return false必须满足 三者之一 才返回trueA为根节点的树包含BB是A左子树的子树B是A右子树的子树判断A为根节点的树是否包含B:如果A为空则返回false如果B为空则返回true!!!(说是这样说明B已经匹配完了如果AB值不同返回false继续匹配(A->left,原创 2021-02-15 17:33:02 · 40 阅读 · 0 评论 -
剑指 Offer 20. 表示数值的字符串
题目链接: leetcode.一个合法的数值字符串应当具有的格式。具体而言,它包含以下部分:符号位,即 +、-两种符号整数部分,即由若干字符 0-9组成的字符串小数点小数部分,其构成与整数部分相同指数部分,其中包含开头的字符e(大写小写均可)、可选的符号位,和整数部分此题允许字符串首末两端有一些额外的空格。使用 string 的 find_first_not_of() 和 find_last_not_of() 函数找到字符串第一个非空字符和最后一个非空字符的位置,然后进行 e原创 2021-02-09 17:11:21 · 47 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
题目链接: leetcode.简单的循环时间复杂度为 O(n),会超时/*301 / 304 个通过测试用例 超时 [2.00000, 2147483648]*/class Solution {public: double myPow(double x, int n) { double ans = 1; if(n == 0 || x == 1) return 1; else if(n > 0) { while(n--) {原创 2021-02-08 13:30:36 · 50 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
题目链接: leetcode.时间复杂度 O(log_2 n)此算法循环内部仅有 移位、与、加 等基本运算,占用 O(1);逐位判断需循环 log_2 n次空间复杂度 O(1)注意:只写n>>1;是没用滴,要再赋值n >>= 1;/*执行用时:4 ms, 在所有 C++ 提交中击败了39.61%的用户内存消耗:5.9 MB, 在所有 C++ 提交中击败了83.28%的用户*/ class Solution {public: int hammingWei原创 2021-02-08 13:15:16 · 51 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
题目链接: leetcode.已知前序遍历与中序遍历,可以通过前序遍历得到根节点再通过中序遍历得到左右子树的元素个数,再回到前序划分左右子树划分得到的左右子树又知道新的前序遍历和中序遍历所以使用**递归**/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int原创 2021-01-14 11:47:19 · 45 阅读 · 0 评论