《剑指offer》
code配上格子衫
终身学习
展开
-
剑指 Offer 35. 复杂链表的复制
题目描述思路分析原链表上进行修改,完成next和random之后,从原链表分离。代码展示/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node(int _val) { val = _val; next = NULL; random = NULL; }};*/class So原创 2020-08-11 17:16:17 · 123 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表
题目描述思路分析dfs保存遍历结果,重新新建链表进行连接,不推荐。但是可以根据二叉树的特点,left和right直接dfs改变指向。代码展示/*// Definition for a Node.class Node {public: int val; Node* left; Node* right; Node() {} Node(int _val) { val = _val; left = NULL;原创 2020-08-11 16:37:57 · 131 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II
题目描述思路分析递归迭代均可,递归加上level显示当前深度代码展示/** * 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 {publ原创 2020-08-09 08:59:41 · 150 阅读 · 0 评论 -
剑指 Offer 32 - 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: void _help原创 2020-08-09 08:49:08 · 137 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列
题目描述思路分析模拟压栈出栈代码展示class Solution {public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { stack<int> s1; int cur = 0; for (int i = 0; i < pushed.size(); i++) {原创 2020-08-08 09:39:58 · 134 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵
题目描述思路分析代码展示class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if (matrix.size() == 0 || matrix[0].size() == 0) { return {}; } vector<int> ret; i原创 2020-08-08 08:55:05 · 112 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
题目描述思路分析利用两个递归,第一个先序遍历递归访问A所有节点,第二个递归,比较是否相等。第一个递归进行了优化,遇到节点值相等进第二个递归,第二个递归,B走到空就说明包含。代码展示/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), l原创 2020-08-07 16:28:55 · 102 阅读 · 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: T原创 2020-08-07 15:32:02 · 107 阅读 · 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 Soluti原创 2020-08-07 15:26:05 · 118 阅读 · 0 评论 -
剑指 Offer 20. 表示数值的字符串
题目描述思路分析将字符串分为三部分 e前 e e后 进行底数判断与指数判断。代码展示class Solution {public: bool isNumber(string s) { //1、从首尾寻找s中不为空格首尾位置,也就是去除首尾空格 int i=s.find_first_not_of(' '); if(i==string::npos)return false; int j=s.find_last_not_of('原创 2020-08-07 11:30:43 · 116 阅读 · 0 评论 -
剑指 Offer 20. 表示数值的字符串
题目描述思路分析正常模拟即可代码展示class Solution {public: bool isNumber(string s) { //1、从首尾寻找s中不为空格首尾位置,也就是去除首尾空格 int i=s.find_first_not_of(' '); if(i==string::npos)return false; int j=s.find_last_not_of(' '); s=s.substr(i原创 2020-08-06 20:11:34 · 98 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数
题目描述思路分析考虑大数越界,因此char或者string模拟打印。代码展示class Solution {public: vector<int> res; vector<int> printNumbers(int n) { if (n <= 0) return res; //创建一个能容纳最大值的字符数组,由于有一位要存储'\0',因此要开大一格 char* number = new char[n + 1]; //初始全部设置为0 mems原创 2020-08-06 19:58:24 · 150 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
题目描述说明:-100.0 < x < 100.0n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。思路分析暴力循环相乘时间复杂度O(N),但是考虑到特殊性我们可以降低复杂度进行计算。使用位运算。代码展示class Solution {public: double myPow(double x, int n) { if(x == 1 || n == 0) return 1; double ans = 1;原创 2020-08-06 09:49:13 · 111 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
题目描述思路分析使用位运算代码展示class Solution {public: int hammingWeight(uint32_t n) { int ret = 0; while (n != 0) { ret += n & 1; n >>= 1; } return ret; }};结果分析时间复杂度O(1)空间复杂度O(1)...原创 2020-08-06 09:33:55 · 199 阅读 · 0 评论 -
剑指 Offer 14- II. 剪绳子 II
题目描述思路分析dp保存会越界,找到最优分割大小为3, 基于3,进行模拟。代码展示class Solution {public: //n >= 5 2*(n-2) > n 3*(n-3) > n 且3*(n-3) >= 2*(n-2) //n = 4 2 * 2 > 1 * 3 //2和3不能再分了 分了就变小了 且3优于2 int cuttingRope(int n) { if (n <= 3) ret原创 2020-08-05 15:23:42 · 105 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子
题目描述思路分析采用贪心的思路,1.任取长度为n的绳子,我们可以切最多n-1刀,现在考虑切的第一刀,有n-1种切法2.那么用dp[n]表示长度为n的绳子可以产生的最大乘积由1可知,dp[n] = max(dp[i]*dp[n-i]),i属于[1,n-1]初始化边界是本题比较狗血的,因为i = 2,3的时候,dp的结果为1,2.但是在其他节点中,他们应该是2 3代码展示class Solution { public: int cuttingRope(int n) {原创 2020-08-05 15:20:51 · 108 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围
题目描述思路分析建立路径,模拟机器人路径,将可以到达的地方全部置为1,最后统计1的个数即可。由于从左上角开始,因此每次向下向右移动即可。限制条件也可以少两个代码展示class Solution {public: bool arr[100][100] = {0}; int movingCount(int m, int n, int k) { int sum = 0; dfs(0, 0, m, n, k); for (int i =原创 2020-08-05 11:40:19 · 120 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径
题目描述思路分析先在原矩阵中寻找到字符串的第一个字母,然后再对这个字母周围矩阵进行深度优先搜索。上下左右开始搜索,改变搜索路径的字符,搜索完成后还原,防止重复搜索。代码展示class Solution {public: bool exist(vector<vector<char>>& board, string word) { bool m=false; for(int i=0;i<board.size();i++) for (int j =原创 2020-08-05 10:22:03 · 108 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
题目描述思路分析需要查找的数组是由有序数组旋转而来的,因此可以使用二分查找,但是需要对二分查找进行一定的修改。ifelse中有三种选择,第一种是待查找元素确定就在数据的右边,第二种和第三种是不确定,因此需要向左边或者向右边移动一个元素距离继续比较。代码展示class Solution {public: int minArray(vector<int>& numbers) { int low = 0; int high = numbers原创 2020-08-05 09:33:27 · 111 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
题目描述思路分析维护两个栈,第一个栈支持插入操作,第二个栈支持删除操作。代码展示class CQueue { stack<int> stack1,stack2;public: CQueue() { while (!stack1.empty()) { stack1.pop(); } while (!stack2.empty()) { stack2.pop();原创 2020-08-05 08:21:41 · 155 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
题目描述思路分析挖掘前序中序遍历的特点前序遍历的第一个节点是根节点,只要找到根节点在中序遍历中的位置,在根节点之前被访问的节点都位于左子树,在根节点之后被访问的节点都位于右子树,由此可知左子树和右子树分别有多少个节点。由于树中的节点数量与遍历方式无关,通过中序遍历得知左子树和右子树的节点数量之后,可以根据节点数量得到前序遍历中的左子树和右子树的分界,因此可以进一步得到左子树和右子树各自的前序遍历和中序遍历,可以通过递归的方式,重建左子树和右子树,然后重建整个二叉树。使用一个 Map 存储中序遍历原创 2020-08-04 16:34:30 · 139 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
题目描述思路分析暴力方法需要好几次的逆置,我们可以使用递归或者辅助栈实现。利用了栈的后进先出的性质,递归的回溯的性质。代码展示辅助栈法class Solution {public: vector<int> reversePrint(ListNode* head) { stack<int> nums; while (head) { nums.push(head->val); he原创 2020-08-04 16:24:34 · 108 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
题目描述思路分析创建新字符串,挨个向后添加,遇到空格替换即可,从前往后,从后往前都可以。代码展示class Solution {public: string replaceSpace(string s) { if (s == "") { return s; } int sum = 0; for (int i = 0; i < s.size(); i++) { if (s[原创 2020-08-04 16:09:29 · 118 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
题目描述mn均小于1000题目分析暴力方法时间复杂度较高,巧妙思路从右上角或者左下角开始查找,根据有序特征每次比较只需向固定方向移动。代码展示class Solution {public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { //杨氏矩阵查找 右上方或者左下方开始 if (matrix.empty()) {原创 2020-08-04 15:50:12 · 174 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
题目描述思路分析暴力方法时间复杂度较高,巧妙采取计数方法。代码class Solution {public: int findRepeatNumber(vector<int>& nums) { vector<int> v1; v1.resize(nums.size()+1, 0); for (auto e : nums) { v1[e]++; if (v1[e]原创 2020-08-04 15:31:02 · 112 阅读 · 0 评论