![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
Onebear599
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 31. 栈的压入、弹出序列
思路K神的,模拟栈作者:jyd链接:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/solution/mian-shi-ti-31-zhan-de-ya-ru-dan-chu-xu-lie-mo-n-2/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。class Solution {public: bool validateStackSequenc.原创 2021-10-09 16:40:23 · 58 阅读 · 0 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字——约瑟夫环
思路作者:sweetieeyi链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/solution/javajie-jue-yue-se-fu-huan-wen-ti-gao-su-ni-wei-sh/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。class Solution {public: int lastRem.原创 2021-10-08 12:50:58 · 65 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
思路解一下K神的图作者:jyd链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/solution/jian-zhi-offer-57-ii-he-wei-s-de-lian-xu-t85z/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。class Solution {public: vector<vector<int.原创 2021-10-08 11:02:49 · 62 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子
思路class Solution {public: int cuttingRope(int n) { if (n<4) return n-1;// n=2,返回1, n=3, 返回2 int k = n / 3; int res; if(n%3==1){ res = pow(3, k-1) * 2 * 2; }else if (n%3==2){ res = .原创 2021-10-08 10:02:57 · 63 阅读 · 0 评论 -
剑指 Offer 66. 构建乘积数组
思路根据表格的主对角线(全为 1),可将表格分为 上三角 和 下三角 两部分。分别迭代计算下三角和上三角两部分的乘积,即可获得结果。作者:jyd链接:https://leetcode-cn.com/problems/gou-jian-cheng-ji-shu-zu-lcof/solution/mian-shi-ti-66-gou-jian-cheng-ji-shu-zu-biao-ge-fe/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。.原创 2021-10-07 20:08:35 · 48 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
思路1 排序由于最多的数字 出现的次数超过了数组长度的一半,因此排序之后正中间的数字就是这个众数一定要记住快排模板。很遗憾,当数字很长的时候,超过时间限制了 = =class Solution {public: // 排序 int majorityElement(vector<int>& nums) { quickSort(nums,0,nums.size()-1); return nums[nums.size()/2]; .原创 2021-10-07 16:57:48 · 61 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<int> res; int原创 2021-10-07 16:11:05 · 136 阅读 · 0 评论 -
2021-10-06
思路1 哈希哈希,简单是简单,就是怕面试挂的太快class Solution {public: int singleNumber(vector<int>& nums) { // B A B C C B C // 哈希 unordered_map<int, int> dic; for(int num:nums){ dic[num]++; } .原创 2021-10-06 18:24:45 · 67 阅读 · 0 评论 -
剑指 Offer 56 - I. 数组中数字出现的次数
思路class Solution {public: vector<int> singleNumbers(vector<int>& nums) { // 1 求异或和,其结果也就是两个不同数的异或结果 int xorsum = 0; for(auto num:nums){ xorsum ^= num; } // 2 建立mask (one-hot), 找到.原创 2021-10-06 17:06:43 · 64 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
写在那面计算机位运算相关概念举例推演上面的结论:原创 2021-10-04 12:25:38 · 108 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
写在前面关于 Brian Kernighan 算法,可以查看这篇博客https://www.cnblogs.com/jerryfish/p/15307637.html它用于将一个二进制数最右边的1变为0算法核心就是 n & (n-1),其中&就是按位与题目class Solution {public: int hammingWeight(uint32_t n) { int res = 0; while(n){ n原创 2021-10-04 10:01:02 · 71 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
class Solution {public: bool verifyPostorder(vector<int>& postorder) { // 后序遍历中倒数第一个结点为根节点root // 如果是二叉搜索树的后序(根据左小右大,并且后序先左后右) // 那么遍历结果存在一个拐点k,k之前都小于root,从k开始都大于root // 如果从k开始到root之前的结点,存在小于root的结点,那就返回false.原创 2021-10-03 14:15:00 · 75 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
关于快速幂下面的图来自于K神简而言之求n的二进制,如果当前位(n&1)为1,那么就可以相乘,否则x不断乘以本身,x^2, x^4, x^8…直到n二进制某位为1,就可以进行相乘。class Solution {public: double myPow(double x, int n) { if(n==0 || x==1) return 1; if(n==1) return x; // 题目给出的n的范围很大,为防止溢出,将其变为lon原创 2021-10-03 11:25:02 · 44 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: TreeNode* lowestCommonAncestor.原创 2021-10-02 12:07:25 · 61 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n
思路本来是可以用等差数列,一步到位。return n*(1+n)/2但是题目规定了不能用乘除法。于是想到递归。递归的思路如下: if(n=1) return n; else // 隐形条件就是n>1 return n+sumNums(n-1);但是题目规定了不能用if,所以就用逻辑短路 n>1 && n += sumNums(n-1); // 只有当n>1时会进行递归 return n;解答代码如下:class Solution {.原创 2021-10-02 10:23:47 · 74 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: int maxDepth(TreeNode* root) {.原创 2021-10-01 10:20:07 · 54 阅读 · 0 评论 -
剑指 Offer 41. 数据流中的中位数(优先队列-堆)
写在前面先了解一下priority_queue而它的底层实际上就是用堆(Heap)实现的C++关于Priority_queue的实现#include<iostream>#include<queue>#include<vector>#include<algorithm>using namespace std;int main(){ priority_queue<int> heap0; // 默认 prior原创 2021-09-30 20:30:38 · 157 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数
作者:jyd链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/solution/mian-shi-ti-45-ba-shu-zu-pai-cheng-zui-xiao-de-s-4/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。多写写快排算法,注意有递归就得有返回条件class Solution {public: string m..原创 2021-09-29 11:41:43 · 40 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
按模板,1,2,3,4步,可以查看代码随想录中的回溯精讲/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(n.原创 2021-09-28 12:01:54 · 49 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围
写在前面之前也写过类似的https://blog.csdn.net/qq_42133142/article/details/111594025上代码递归四个方向(与第二十题类似)class Solution {public: int movingCount(int m, int n, int k) { vector<vector<int>> visit(m, vector<int>(n)); return dfs(vi原创 2021-09-27 10:17:42 · 39 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径
写在前面之前写过一篇类似的https://blog.csdn.net/qq_42133142/article/details/111560333这个代码只能通过一半,思考了半天搞不明白,求大佬解答class Solution {public: bool exist(vector<vector<char>>& board, string word) { int len = 0; // 记录当前匹配长度 for(int原创 2021-09-27 09:48:48 · 35 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
思路双指针,(类似于快排的两个指针 = =)class Solution {public: vector<int> exchange(vector<int>& nums) { int i = 0, j = nums.size()-1; while(i<j){ while(j>=0 && nums[j]%2==0){ // 加入是否越界判断 .原创 2021-09-26 15:51:24 · 38 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字
思路双指针,大了往左,小了往右class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> res; int i = 0, j = nums.size()-1; while(i<j){ int sum = nums[.原创 2021-09-26 15:49:16 · 36 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序
字符串模板代码这类题目我的惯常做法,也是核心思想,就是先把句子中所有字符串取出放入字符串数组,再对数组中的字符串进行操作后重新连接即可,具体问题具体细节还需要按题目要求分析而遍历句子取字符串的思路,就是遇到字符把它放入临时字符串,遇到空格或者标点(如果有标点),就把临时字符串输出,并且清空需要注意的是这类题目可以分为两类,一类是有前置或者后置空格的,另一类是没有前置和后置空格的。1、如果有前后置空格,那么必须判断临时字符串非空才能输出,否则会输出空串 s += " "; //这里在最后一.原创 2021-09-26 15:45:16 · 37 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
思路:由于两条链表在相交节点后面的部分完全相同,因此我们可以先对两条链表进行遍历,分别得到两条链表的长度,并计算差值 d。让长度较长的链表先走 d 步,然后两条链表同时走,第一个相同的节点即是节点作者:AC_OIer链接:https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/solution/gong-shui-san-xie-zhao-liang-tiao-lian-b-if.原创 2021-09-25 23:27:21 · 68 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListN.原创 2021-09-25 21:51:05 · 39 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点
思路: 就是正常思路。建立头结点是为了统一(如果第一个结点head就是需要删除的,那么可能需要分情况讨论。有了头节点就可以统一了)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: L.原创 2021-09-24 15:34:59 · 36 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
思路1:使用栈(内存大)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution{public: ListNode* getKthFromEnd(ListNode* head, int k) { .原创 2021-09-24 15:32:33 · 38 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
思路:作者:xiao_ben_zhu链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/solution/shou-hui-tu-jie-dfsdi-gui-ji-yi-hua-di-gui-dong-ta/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。class Solution {public: int translateNum(i.原创 2021-09-23 20:44:59 · 48 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值
思路转移方程:dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i-1][j-1];走到当前格时累计礼物最大价值为 走到**当前格的左一格(dp[i][j-1])或上一格(dp[i-1][j])时累计礼物最大价值加上当前格礼物(grid[i-1][j-1])**的价值dp从(1,1)开始索引,这样确保第一个值等于grid中的第一个值。这也是为什么dp数组要进行扩容class Solution {public: int maxValue(vec.原创 2021-09-22 14:30:22 · 42 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
class Solution {public: int maxSubArray(vector<int>& nums) { // 1. 确定dp数组以及下标含义 // dp[i] 是指截至到i元素出现的最大和 // 2. 状态转移方程 // 加上nums[i] or 重新开始 // dp[i] = max(dp[i-1]+nums[i], nums[i]); // res = .原创 2021-09-22 11:08:33 · 57 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润
class Solution {public: int maxProfit(vector<int>& prices) { // 毫无疑问,肯定时最低点买入时利润最大 // 因为卖出点都是price[i],我买入时越低(低点在i之前),我的利润就越大 // 1. 确定dp数组及下标含义 // dp[i] 代表前i天的最大利润 // 2. 确定递推 // minPrice =.原创 2021-09-21 12:17:54 · 46 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题
class Solution {public: int numWays(int n) { // 五部曲 // 1. 确定dp数组以及下标含义 // dp[i] 跳上第i层有多少跳法 // dp[i-1] 跳上第i-1层有多少跳法 // dp[i-2] 跳上第i-2层有多少跳法 // 2. 确定递推公式 // 第i层可以由[i-1]层跳一步或者[i-2]层跳.原创 2021-09-21 11:26:49 · 47 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列
思路DPclass Solution {public: int fib(int n) { // for循环i从2开始,如果n<=1而执行for,则dp[i]就会报错 if(n<=1) return n; const int MOD = 1000000007; vector<int> dp(n+1); dp[0] = 0; dp[1] = 1;.原创 2021-09-21 10:57:39 · 59 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: // dfs: 用以判断 // (左子树的.原创 2021-09-20 12:54:18 · 37 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: TreeNode* mirrorTree(TreeNode*.原创 2021-09-20 12:53:24 · 37 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: // isSubStructure 相当于先序遍历 .原创 2021-09-20 12:50:50 · 131 阅读 · 0 评论 -
剑指 Offer 32 - III. 从上到下打印二叉树 III
思路:在上一题的基础上剑指 Offer 32 - II. 从上到下打印二叉树 IIhttps://blog.csdn.net/qq_42133142/article/details/120379103加一个flag来决定当前层输出的结点列表temp_vec是否要进行翻转,翻转可以使用reverse函数/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left;.原创 2021-09-19 12:10:18 · 73 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II
思路:在树的层序遍历基础上,加一个内循环(将此次循环队列中的所有元素输出)。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {pub.原创 2021-09-19 12:07:24 · 59 阅读 · 0 评论 -
剑指 Offer 32 - I. 从上到下打印二叉树
思路 套模板,树的层次遍历(BFS),用队列实现/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vecto.原创 2021-09-19 12:04:14 · 75 阅读 · 0 评论