剑指offer
sususuqingxiao
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 36. 二叉搜索树与双向链表 C++ 2021-08-30
剑指 Offer 36. 二叉搜索树与双向链表中序遍历DFS void型套路/*// Definition for a Node.class Node {public: int val; Node* left; Node* right; Node() {} Node(int _val) { val = _val; left = NULL; right = NULL; } Node(int原创 2021-08-30 23:08:07 · 124 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制 C++ 2021-08-27
剑指 Offer 35. 复杂链表的复制1、很呆的一种使用hashmap的方法,记录每个节点的位置class Solution {public: Node* copyRandomList(Node* head) { if (head == nullptr) { return head; } Node* temp = head; Node* copy_head原创 2021-08-27 21:24:03 · 67 阅读 · 0 评论 -
剑指 Offer 19. 正则表达式匹配(回看) C++ 2021-08-26
剑指 Offer 19. 正则表达式匹配1、动态规划的思想f[i][j] 代表 A 的前 i个和 B 的前 j 个能否匹配class Solution {public: bool isMatch(string A, string B) { int n = A.length(); //主串 int m = B.length(); //正则串 // vector<vector<bool>> f(n + 1,原创 2021-08-26 20:43:18 · 64 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方 C++ 2021-08-26
剑指 Offer 16. 数值的整数次方用二分法递归,不递归就超时,时间复杂度log nclass Solution {public: double myPow(double x, int n) { if(n==0 || x==1.0) return 1.0; if(n==1) return x; if(n==-1) return 1.0/x; double res=myPow(x, n/2);原创 2021-08-26 16:47:06 · 137 阅读 · 0 评论 -
剑指 Offer 20. 表示数值的字符串 C++ (恶心)2021-08-26
剑指 Offer 20. 表示数值的字符串1、逻辑思维方法(推荐),关键是判断符号整、无符号整数两个函数的精妙。还有就是小数点那个东西三种情况,其余两种太恶心人了。注:该code来自于class Solution {private: // 整数的格式可以用[+|-]B表示, 其中B为无符号整数 bool scanInteger(const string s, int& index) { if(s[index] == '+' || s[index]原创 2021-08-26 16:26:15 · 135 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构 C++ 2021-08-23(辅助递归函数很重要)
剑指 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: bool isSubS原创 2021-08-23 04:10:43 · 253 阅读 · 0 评论 -
剑指 Offer 14- II. 剪绳子 II C++ 2021-08-23(注意大数求余)
剑指 Offer 14- II. 剪绳子 II主要是一个大数求余class Solution {public: int cuttingRope(int n) { int MOD = 1e9+7; if (n == 2) return 1; if (n == 3) return 2; if (n == 4) return 4; i原创 2021-08-23 01:44:23 · 96 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子 C++ 2021-08-22
剑指 Offer 14- I. 剪绳子这就是个数学题。。。动态规划什么的,没公式推导好使。class Solution {public: int cuttingRope(int n) { if (n == 2) return 1; if (n == 3) return 2; if (n == 4) return 4; int mutil = n/3原创 2021-08-22 22:51:28 · 59 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树 C++ 2021-08-22
剑指 Offer 07. 重建二叉树 //preorder 根左右 //inorder 左根右/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }原创 2021-08-22 21:36:41 · 74 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先 C++ 2021-08-22
剑指 Offer 68 - II. 二叉树的最近公共祖先1、这个题剑指offer定义简单,其实想不到逻辑他就不简单这题不像二叉搜索树那样是有规律的与根作比较,多种判断就可以了。很明显可以想到该题是在更新公共祖先根节点肯定是他们的公共祖先,那么向下看,如果都出现在左子树那么就可以更新最近公共节点了,就是root->left,同理右边节点也一样。就依次向下递归。/** * Definition for a binary tree node. * struct TreeNode { *原创 2021-08-22 13:01:19 · 94 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 C++ 2021-08-20
剑指 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:原创 2021-08-20 20:24:47 · 71 阅读 · 0 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字 C++ 2021-08-20
剑指 Offer 62. 圆圈中最后剩下的数字1、暴力肯定会超时,所以得找规律class Solution {public: int lastRemaining(int n, int m) { int dp_n1 = 0, dp_n2 = dp_n1; int n2 = 2; while(n2 <= n) { dp_n2 = (dp_n1 + m)%n2; dp_n原创 2021-08-20 01:47:14 · 111 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树 C++ 2021-08-19
剑指 Offer 55 - II. 平衡二叉树1、递归求得左右子树的高度class Solution {public: bool isBalanced(TreeNode* root) { if (root == nullptr ||(root->left == nullptr && root->right == nullptr)) return true; return (abs(depMax(r原创 2021-08-19 22:54:49 · 82 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子 C++ 2021-08-19
剑指 Offer 61. 扑克牌中的顺子1、无脑写法,先排序,然后判断重复、间隔数有没有大于0的个数class Solution {public: bool isStraight(vector<int>& nums) { sort(nums.begin(), nums.end()); int count0 = 0; int i = 0; while (i < nums.size()原创 2021-08-19 17:50:52 · 190 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法 C++ 2021-08-19
剑指 Offer 65. 不用加减乘除做加法class Solution {public: int add(int a, int b) { while (b != 0) { int temp = a ^ b; b = ((unsigned int)(a & b) << 1);//注意这个地方,leetcode的C++ 不能对复数左移 a = temp;原创 2021-08-19 15:47:09 · 61 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字 C++ 2021-08-18
剑指 Offer 53 - II. 0~n-1中缺失的数字class Solution {public: int missingNumber(vector<int>& nums) { int l = 0; int r = nums.size(); int mid = 0; while (r > l) { mid = l + (r - l)/2;原创 2021-08-18 15:02:40 · 71 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I C++ 2021-08-16
剑指 Offer 53 - I. 在排序数组中查找数字 I1、直观感受,二分找到Target位置,然后向两边扩展计数。class Solution {public: int numPosition(vector<int>& nums, int target) { int left = 0; int right = nums.size(); int mid = left + (right - left)/2;原创 2021-08-16 22:15:51 · 127 阅读 · 1 评论 -
剑指 Offer 58 - I. 翻转单词顺序 C++ 2021-08-16
剑指 Offer 58 - I. 翻转单词顺序1、用栈直接解决就好,但是秉承能用vector就不用其它的原则我选择用vectorclass Solution {public: string reverseWords(string s) { vector<string> res; int len = s.size(); // cout << "s.size: " << len << end原创 2021-08-16 21:02:30 · 101 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点 C++ 2021-08-16
剑指 Offer 52. 两个链表的第一个公共节点1、下面这种方法比较直观,双指针方法比较优秀/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode *getInter原创 2021-08-16 17:17:13 · 63 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列 C++ 2021-08-16
剑指 Offer 57 - II. 和为s的连续正数序列连续正整数序列(至少含有两个数)注意连续。。。class Solution {public: vector<vector<int>> findContinuousSequence(int target) { vector<vector<int>> res; if (target < 3) return res;原创 2021-08-16 13:42:44 · 51 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字 C++ 2021-08-16
剑指 Offer 57. 和为s的两个数字1、双重for暴力解的话会超时,那就只能先找到最接近target的位置然后两头进行汇合。如果相加 > target,那就左边不变右边向左移一位。如果相加 < target,那就左边不向右移一位,右边不动。class Solution {public: int findPosition(vector<int>& nums, int target)//找到一个刚好大于或等于target的位置 { i原创 2021-08-16 11:40:54 · 70 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度 C++ 2021-08-16
剑指 Offer 55 - I. 二叉树的深度DFS肯定是递归,递归按着逻辑来写,就是递归成子问题,然后注意递归条件就好/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };原创 2021-08-16 00:57:38 · 71 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符 C++ 2021-08-16
剑指 Offer 50. 第一个只出现一次的字符采用hashmap的思想,记录那些出现只一次的数和出现的位置class Solution {public: char firstUniqChar(string s) { char one = ' '; if (s.size() == 0) return one; vector<int> ch(26, 0); vecto原创 2021-08-16 00:31:10 · 48 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II C++ 2021-08-15
剑指 Offer 32 - II. 从上到下打印二叉树 II1、典型层序遍历,就是队列实现/** * 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原创 2021-08-15 23:49:49 · 81 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字 C++ 2021-08-15
剑指 Offer 39. 数组中出现次数超过一半的数字1、这种想法对本题有用,当然最直接得还是排序取中间那个数。当然这种想法只是针对已知数据肯定有一个大于一半得众数而言的。通用的就是用hashmap进行统计。出现次数超过一半的就是结果,没有那就是没有符合要求的值。class Solution {public: int majorityElement(vector<int>& nums) { if (nums.size() == 0)原创 2021-08-15 23:33:00 · 132 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围 (BFS/DFS) C++ 2021-08-11
剑指 Offer 13. 机器人的运动范围1、直观想法,扫描先记录满足要求的格子,再基于满足要求判断是否可达//扫描遍历行或者列class Solution {// public:// int res;// vector<vector<bool>> used(m, vector<bool>(n, false));public: int movingCount(int m, int n, int k) { v原创 2021-08-11 22:06:53 · 129 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和 C++ 2021-08-11
剑指 Offer 42. 连续子数组的最大和1、很直接的想法,其实就是动规,下面有动规的写法//对后面的数字而言,前面结果是复数或0就抛弃//留一个max变量class Solution {public: int maxSubArray(vector<int>& nums) { int max = nums[0]; int sum = nums[0]; int i = 1; while (i &原创 2021-08-11 17:27:16 · 48 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈 C++ 2021-08-11
剑指 Offer 30. 包含min函数的栈//1、首先它有栈的功能 pop top pop那就是一个栈结构 stack//2、它可以O(1)查找最小值,那必然有个结构按序记录最小值,当然可以用一个栈来记录最小值 stack_minclass MinStack {public: /** initialize your data structure here. */ MinStack() { while (!st.empty()) st.pop();原创 2021-08-11 16:26:03 · 63 阅读 · 0 评论 -
剑指 Offer 40. 最小的k个数 C++ 2021-08-11
剑指 Offer 40. 最小的k个数1、直接法 排序选k个class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { vector<int> res; sort(arr.begin(), arr.right()); res.assign(arr.begin(), arr.begin()原创 2021-08-11 16:06:18 · 90 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点 C++ 2021-08-07
剑指 Offer 18. 删除链表的节点/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* deleteNode(ListNode* head, int val)原创 2021-08-07 16:37:40 · 48 阅读 · 0 评论 -
剑指 Offer 24. 反转链表 C++ 2021-08-07
剑指 Offer 24. 反转链表1、正常逻辑来写,迭代法/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseList(ListNode* head原创 2021-08-07 15:53:26 · 71 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数 C++ 2021-08-07
剑指 Offer 17. 打印从1到最大的n位数class Solution {public: vector<int> printNumbers(int n) { vector<int> vec; int i = 0; while (++i < pow(10,n)) { vec.push_back(i); } return vec;原创 2021-08-07 14:59:43 · 50 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点 2021-08-07
剑指 Offer 22. 链表中倒数第k个节点双指针解法(快慢指针)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* getKthFromEnd(ListNode原创 2021-08-07 11:39:49 · 53 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列 2021-08-07
剑指 Offer 09. 用两个栈实现队列要注意的就是构造函数中别忘了清空栈,虽然空着不写对本题也没影响。class CQueue {public: CQueue() //注意构造函数中的清空栈 { while (!st1.empty()) st1.pop(); while (!st2.empty()) st2.pop(); } void appendTail(int value)原创 2021-08-07 11:29:36 · 62 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵 c++ 2021-07-24
剑指 Offer 29. 顺时针打印矩阵参考题解:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/solution/mian-shi-ti-29-shun-shi-zhen-da-yin-ju-zhen-she-di/class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matr原创 2021-07-24 22:41:03 · 96 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径 (DFS) C++ 2021-07-19(回看)
剑指 Offer 12. 矩阵中的路径class Solution {public: bool dfs(vector<vector<char>>& board, int rowIndex, int colIndex,vector<vector<bool>>& used, string word, int index); bool exist(vector<vector<char>>& boa原创 2021-07-19 16:38:57 · 160 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数 c++ 2021-07-19
剑指 Offer 15. 二进制中1的个数比较直接,没啥特殊的class Solution {public: int hammingWeight(uint32_t n) { uint32_t num = 1; uint32_t temp = n; int count = 0; for (int i = 0; i < 32; i++) { if ((n & 1) ==原创 2021-07-19 14:59:17 · 48 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 (双指针)C++ 2021-07-19
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面双指针解法class Solution {public: vector<int> exchange(vector<int>& nums) { int low = 0; int high = nums.size() - 1; while (low < high) { while (low < high原创 2021-07-19 14:34:14 · 58 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树 C++ 2021-07-18(回看)
剑指 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: bool原创 2021-07-18 23:25:48 · 64 阅读 · 1 评论 -
剑指 Offer 27. 二叉树的镜像 C++ 2021-07-18
剑指 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* m原创 2021-07-18 22:17:33 · 91 阅读 · 0 评论