leetcode
刷题
踩坑记录
通信->算法->IC
展开
-
medium 剑指 Offer 从上到下打印二叉树 III 层序遍历 BFS
整层翻转:c++ STLvector reverse 原地反转class Solution {public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> res; if(root == nullptr){ return res; } queue<Tree..原创 2022-01-19 17:34:59 · 51 阅读 · 0 评论 -
medium 剑指 Offer 数字序列中某一位的数字
逐步求解:eg:n=548对于012345678910111213.....先求出第548位对应的数所在“计数”:219;求出第548位数字,对应“计数”的位数:219对应3位,d=3;求出第548位数字,对应“计数”所在段的数字量:100-999共有900个,count=900;求出219是从谁开始数的:100;求出第548位数字,对应是219的第几位,对应第1位(从第0位开始);去掉219第1位之后的数:21 (219从左到右,依次为第0 1 2位):取出21的个位:21%10..原创 2022-01-17 22:22:34 · 352 阅读 · 0 评论 -
medium 剑指 Offer 从上到下打印二叉树 广度优先搜索 层序遍历
广度优先搜索 层序遍历 队列:c++class Solution {public: vector<int> levelOrder(TreeNode* root) { vector<int> res; // 一层一层装,每层都是vector<int> if(root == nullptr){ return res; } queue<TreeNode*>..原创 2022-01-15 15:16:39 · 225 阅读 · 0 评论 -
medium 剑指 Offer 字符串的排列 回溯 dfs
深度优先搜索 回溯:c++class Solution {public: vector<string> permutation(string s) { if(s.size()==0){ return {}; // return vector } string temp=""; sort(s.begin(),s.end()); vector<bool>use..原创 2022-01-14 17:32:05 · 97 阅读 · 0 评论 -
medium 剑指 Offer 栈的压入、弹出序列 辅助栈
辅助栈:辅助栈模拟入栈,出栈情况,i指针指向popped当前需要弹出的数字,与辅助栈栈顶数字对比,相同则辅助栈弹出,且popped指针后移。c++class Solution {public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { if(pushed.size()!=popped.size()){ re..原创 2022-01-03 22:52:12 · 733 阅读 · 0 评论 -
medium 剑指 Offer 二叉搜索树与双向链表 递归 栈 中序遍历
递归:要求返回的“head” 表示指向链表中有最小元素的节点,即中序遍历的第一个。需要先找到树最左节点,二叉查找树的中序遍历序列一定是从小到大排列的。中序遍历:左中右c++为对二叉树作 “左、根、右” 顺序遍历,递归实现如下:void dfs(Node* root) { if(root == nullptr){ return; } dfs(root->left); // 左 cout << root->val <&l...原创 2021-12-27 18:38:21 · 836 阅读 · 0 评论 -
medium 剑指 Offer 复杂链表的复制 哈希表 拼接+拆分
哈希表:第一次遍历原链表(已用 next 指针连接,用 while(cur != nullptr)循环 cur = cur->next 遍历),复制遍历过的节点(创建新节点)。c++class Solution {public: Node* copyRandomList(Node* head) { if(head == nullptr){ return nullptr; } // 复制节点 值 ...原创 2021-12-07 15:51:16 · 1105 阅读 · 0 评论 -
medium 剑指 Offer 数值的整数次方 快速幂
快速幂:eg:2^10=1024, 10=1010(二进制) 有1的位置对应2^8*2^2=2^10=1024每次1010右移一位,看最后一位是不是1每次右移一位,1111->2^8,2^4,2^2,2^1:幂次:1,2,4,8->2^0,2^1*2^1=2^2,2^2*2^2=2^4,2^4*2^4=2^8,b=1010, x = 2*2 = 4 = 2^2, 给101用b=101, x = 4*4 = 16 = 2^4, 给10用b=10, x = 16*16 = 2..原创 2021-11-26 19:07:23 · 159 阅读 · 0 评论 -
medium 剑指 Offer 表示数值的字符串
依次判断: 数字的格式可以用A[.[B]][e|EC]或者.B[e|EC]表示,其中A和C都是整数(可以有正负号,也可以没有),而B是一个无符号整数c++class Solution {public: // 数字的格式可以用A[.[B]][e|EC]或者.B[e|EC]表示, // 其中A和C都是整数(可以有正负号,也可以没有),而B是一个无符号整数 bool isNumber(string s) { if(s.size() == 0) ...原创 2021-11-17 18:58:44 · 62 阅读 · 0 评论 -
medium 剑指 Offer 树的子结构 遍历递归
遍历递归:c++class Solution {public: bool isSubStructure(TreeNode* A, TreeNode* B) { // A B 树空 if(A == nullptr || B == nullptr){ return false; } return iscontain(A, B) || isSubStructure(A->left, B) || is..原创 2021-11-16 13:43:35 · 906 阅读 · 0 评论 -
medium 剑指 Offer II. 剪绳子 II 贪心 大数越界
贪心(大数):本题和 剪绳子I 一样,但扩大了n的范围,导致了大数越界情况的出现。动态规划需要借助之前保存的dp[ ]列表,尝试在动态规划的基础上取余,就算把数据类型都换成 long 也是无解的,对每次的 dp[ i ] 取余确实可以避免溢出的问题,但是由于过程中修改了值,会导致最终结果和预期不同。贪心算法的求解过程就是简单的乘法,(100000009 % 1000000007) * 3 和 (100000009 * 3)% 1000000007的结果是一样的贪心:当绳子长度大于4时,尽可能多的分.原创 2021-11-12 20:00:34 · 1471 阅读 · 0 评论 -
medium 剑指 Offer I. 剪绳子 动态规划
动态规划:dp[ i ]表示长度为 i 的绳子的最大乘积值i 剪成 [ j, i-j ]其中 j 长的绳子最大值可以分为切还是不切:max( dp[ j ], j )剩下 i-j 长绳子最大乘积:max(i-j,dp[i-j])c++class Solution {public: int cuttingRope(int n) { vector<int> dp(n+2, 0); // dp[i]代表i长度切断后的最大乘积 dp[2] =..原创 2021-11-11 18:19:31 · 531 阅读 · 0 评论 -
medium 剑指 Offer 重建二叉树 递归(分治)
递归(分治):c++public/private的函数都调用的成员变量,需要放在public函数外,写在public一个函数里,private函数不能调用class Solution {public: unordered_map<int, int> index; // public/private的函数都调用的成员变量,需要放在public函数外,写在public一个函数里,private函数不能调用 TreeNode* buildTree(vector<in.原创 2021-11-09 17:59:12 · 713 阅读 · 1 评论 -
medium 剑指 Offer 机器人的运动范围 DFS(递归)广度优先遍历 BFS(队列)
深度优先遍历 DFS(递归):c++class Solution {public: int movingCount(int m, int n, int k) { vector<vector<bool>> visited(m, vector<bool>(n, 0)); // m个vector<bool> int ans = search(0, 0, m, n, k, visited); r..原创 2021-11-08 18:33:54 · 380 阅读 · 0 评论 -
medium 剑指 Offer 矩阵中的路径 回溯(递归)
回溯(递归): 路径要求:可上下左右,但是不可以重复使用进入过的位置 * 类似于找迷宫的问题,使用回溯法 * 回溯也是递归 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。c++class Solution {public: bool exist(vector<vector<char>>& board, string word) { if(..原创 2021-11-05 12:34:34 · 232 阅读 · 0 评论 -
medium 剑指 Offer 二维数组中的查找 遍历 线性查找
遍历:c++class Solution {public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { if( matrix.size()==0 || matrix.size()==0 ) { return false; } int rows = matrix.size(); // 不能一开..原创 2021-10-15 11:37:43 · 61 阅读 · 0 评论 -
easy 剑指 Offer 二叉树的最近公共祖先 递归
递归 (分岔点即公共祖先):l、r 非空时,说明 p、q 分居 root 的两侧,root 就是 最近公共祖先l、r 任一为空,说明 最近公共祖先位于另一子树或其祖先中c++class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(!root || root==p || root==q){ // 递归终止条件,当前节点是t..原创 2021-10-11 19:26:12 · 43 阅读 · 0 评论 -
easy 剑指 Offer 二叉搜索树的最近公共祖先 遍历 分岔点即公共祖先
两次遍历:c++class Solution {public: vector<TreeNode*> getPath(TreeNode* root, TreeNode* target){ vector<TreeNode*> path; TreeNode* node = root; while (node != target){ path.push_back(node); // 记录路径 ..原创 2021-10-11 17:29:41 · 39 阅读 · 0 评论 -
easy 剑指 Offer 扑克牌中的顺子 哈希表
哈希表:遍历 最大牌 - 最小牌 < 5unordered_map<int,bool> mp; // C++ 哈希表mp.count(n); // 哈希表 count的是key,不是valuec++class Solution {public: bool isStraight(vector<int>& nums) { unordered_map<int,bool> mp; // 哈希表 int m..原创 2021-10-04 13:40:49 · 88 阅读 · 0 评论 -
easy 剑指 Offer 圆圈中最后剩下的数字 约瑟夫环问题
约瑟夫环问题递归公式 f(n) = [ f(n-1) + m ] % nn为该轮没删除之前数字个数c++class Solution {public: int lastRemaining(int n, int m) { int f = 0; // f(1)=0,最后序列还剩一个数字f(1)时,就是答案,答案index=0。 for(int i=2; i<=n; i++){ // i为该轮没删除之前数字个数 f = (f..原创 2021-10-04 13:33:22 · 61 阅读 · 0 评论 -
easy 剑指 Offer 不用加减乘除做加法 位运算
位运算:s=a+b⇒s=n+c 即循环 进位和+不进位和, 直到无进位, s=n+c=nc++int,int unsigned 区别是最高位,int表示符号位,而unsigned表示数据位。所以int可以表示负数,而unsigned不能。unsigned可以表示的正数范围比int大一倍。class Solution {public: int add(int a, int b) { // a + b == 进位和 + 无进位和 while(b != 0){ ..原创 2021-09-25 16:19:57 · 47 阅读 · 0 评论 -
easy 剑指 Offer 二叉搜索树的第k大节点 中序遍历 栈 递归
二叉搜索树(二叉查找树、二叉排序树)二叉搜索树(二叉查找树、二叉排序树):每棵子树头节点的值都比各自左子树上所有节点值要大,也都比各自右子树上所有节点值要小。二叉查找树的中序遍历序列一定是从小到大排列的。平衡二叉查找树:任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过1中序遍历 栈:二叉查找树的中序遍历序列一定是从小到大排列的c++class Solution {public: int kthLargest(TreeNode* root, int k原创 2021-09-23 19:22:54 · 81 阅读 · 1 评论 -
easy 剑指 Offer 0~n-1中缺失的数字 二分查找
二分查找:c++class Solution {public: int missingNumber(vector<int>& nums) { int i = 0; int j = nums.size()-1; while(i<=j){ int m = (i+j)/2; if(nums[m] == m){ i=m+1; ..原创 2021-09-23 17:45:13 · 38 阅读 · 0 评论 -
easy 剑指 Offer II. 左旋转字符串 列表遍历拼接
列表遍历拼接:c++class Solution {public: string reverseLeftWords(string s, int n) { string res; int l = s.size(); for(int i=n; i<l; i++){ res += s[i]; } for(int i=0; i<n; i++){ res..原创 2021-09-23 16:11:04 · 55 阅读 · 0 评论 -
easy 剑指 Offer 在排序数组中查找数字 I 二分查找
二分查找:找 target 的过程都是一个不断趋近 target 右边界的过程找 8 左/右边界:找 target = 8,不断趋近 8 右边界找 target = 7,不断趋近 7 右边界,即 8 的左界c++class Solution {public: int helper(vector<int>& nums, int target){ int i=0; int j = nums.size()-1; whi..原创 2021-09-22 17:06:35 · 39 阅读 · 0 评论 -
easy 剑指 Offer 翻转单词顺序 栈 双指针
双指针:c++res.pop_back(); // 去掉结尾class Solution {public: string reverseWords(string s) { string res; int r = s.size()-1; int l; while(r >= 0){ while(r >= 0 && s[r] == ' '){ ..原创 2021-09-22 14:04:04 · 66 阅读 · 0 评论 -
easy 剑指 Offer 和为s的连续正数序列 滑动窗口
滑动窗口:连续正整数:即窗口内所有值c++class Solution {public: vector<vector<int>> findContinuousSequence(int target) { vector<vector<int>> res; int i = 1; // 滑动窗口的左边界 int j = 2; // 滑动窗口的右边界 int sum = 3;原创 2021-09-18 12:58:04 · 59 阅读 · 0 评论 -
easy 剑指 和为s的两个数字 哈希表 双指针
类似的题:返回找到数组的下标的:easy 两数之和 II - 输入有序数组 哈希表 双指针哈希表:vector return 可以用 { }c++:class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { // 查找用哈希表 int temp; unordered_map<int, int> mp;原创 2021-09-17 19:41:48 · 69 阅读 · 0 评论 -
easy 剑指 Offer 第一个只出现一次的字符 哈希表
哈希表:对字符串进行两次遍历c++:class Solution {public: char firstUniqChar(string s) { // 查找问题 可以用哈希表 unordered_map <char, int> mp; // 哈希表 for(auto c:s){ mp[c]++; } for(auto c:s){ // 从s中取出key原创 2021-09-16 13:29:05 · 43 阅读 · 0 评论 -
easy 剑指 从上到下打印二叉树 层序遍历 广度优先搜索
广度优先搜索 BFS:初始化 vector<int> layer(n),长度为n,每个元素进行缺省的值初始化,对于int,也就是被赋值为0 (没有左(右)节点会填充0)vector<int> layer(n,3) 初始化为包含n个值为3的intC++class Solution {public: vector<vector<int>> levelOrder(TreeNode* root) { vector<ve..原创 2021-09-16 12:36:35 · 69 阅读 · 0 评论 -
easy 剑指 Offer 最小的k个数 排序 优先队列 递归快排
排序函数:c++vector 排序class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { vector<int> res(k, 0); // vector 初始化 sort(arr.begin(), arr.end()); // 小到大排序 int c=0; ..原创 2021-09-11 14:36:54 · 79 阅读 · 0 评论 -
easy 剑指 删除链表的节点 双指针
双指针:c++:class Solution {public: ListNode* deleteNode(ListNode* head, int val) { ListNode* low = head; ListNode* p = head; if(head->val == val){ return head->next; } head = head->next;..原创 2021-09-09 15:23:48 · 44 阅读 · 0 评论 -
easy 剑指 Offer 反转链表 迭代 栈
迭代:将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。c++:class Solution {public: ListNode* reverseList(ListNode* head) { ListNode* prev = nullptr; ListNode* curr = head; // 当前处理的节点 while..原创 2021-09-08 20:30:38 · 49 阅读 · 0 评论 -
剑指 Offer 打印从1到最大的n位数 大数打印
项目场景:c++class Solution {public: vector<int> printNumbers(int n) { int m =0 ; vector<int> res; for(int i=0; i<n; i++){ m += 9*pow(10,i); } // n=1,m=9; n=2,m=99; n=3,m=999... m = 9x10^0 + 9原创 2021-09-08 19:51:33 · 73 阅读 · 0 评论 -
剑指 Offer 链表中倒数第k个节点 双指针
暴力搜索: 总数是c个, 倒数是第 k 个, 正数就是第 c-k 个c++class Solution {public: ListNode* getKthFromEnd(ListNode* head, int k) { int c=0; ListNode* p = head; while(p != nullptr){ c++; p = p->next; } ..原创 2021-08-17 19:01:07 · 49 阅读 · 0 评论 -
easy 剑指 Offer 顺时针打印矩阵 状态机 按层模拟
状态机:c++class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if(matrix.size() == 0 ) return {}; // 一维矩阵 vector<int> res; int i = 0, j = 0; // i,j分别表示当前.原创 2021-08-14 14:41:19 · 52 阅读 · 0 评论 -
easy 剑指 Offer 二进制中1的个数 位运算 STL
位运算 方法一:通过 n & 1 来统计当前 nn 的最低位是否为 1,同时每次直接对 n 进行右移并高位补 0。pythonclass Solution: def hammingWeight(self, n: int) -> int: res = 0 while n: res += n & 1 # 0&1=0, 1&0=0, 0&0=0, 1&1=1 与 只有遇到1的时候..原创 2021-08-10 10:29:53 · 195 阅读 · 0 评论 -
easy 剑指 Offer 调整数组顺序使奇数位于偶数前面 头尾双指针 快慢双指针
头尾双指针:c++class Solution {public: vector<int> exchange(vector<int>& nums) { int l=0; int r= nums.size()-1; while(l<r){ if(nums[l]%2 != 0){ // 前奇数,满足条件 l++; ..原创 2021-08-09 12:40:53 · 43 阅读 · 0 评论 -
easy 剑指 Offer 二叉树的镜像 递归 DFS 栈 BFS
递归 (深度优先搜索 DFS):c++class Solution {public: TreeNode* mirrorTree(TreeNode* root) { if(root == nullptr){ return nullptr; } // 交换该根节点左右树 TreeNode* temp = root->left; root->left = root->ri..原创 2021-08-08 14:18:07 · 60 阅读 · 0 评论 -
easy 剑指 Offer 从尾到头打印链表 STL 栈
双端容器:c++ STL vectorclass Solution {public: vector<int> reversePrint(ListNode* head) { vector<int> res; while(head){ res.insert(res.begin(), head->val); // 在指定位置插值 insert (位置迭代器) head = head..原创 2021-08-07 14:46:55 · 71 阅读 · 0 评论