剑指offer
面试刷题
WlH__
这个作者很懒,什么都没留下…
展开
-
剑指offer专项突击--第十七天
剑指 Offer II 050. 向下的路径节点之和空间换时间,用哈希表class Solution {public: unordered_map<int,int>mp; int ans=0; void dfs(TreeNode* root,int targetSum,int nowSum){ mp[nowSum]++; if(mp[nowSum+root->val-targetSum]) ans+=(mp[nowSum+roo原创 2022-04-07 10:00:00 · 295 阅读 · 0 评论 -
剑指offer专项突击--第十六天
剑指 Offer II 047. 二叉树剪枝深搜class Solution {public: TreeNode* dfs(TreeNode* root){ if(root->left) root->left=dfs(root->left); if(root->right) root->right=dfs(root->right); if(root->val==0&&!root->l原创 2022-04-06 13:07:26 · 115 阅读 · 0 评论 -
剑指offer专项突击--第十五天
剑指 Offer II 044. 二叉树每层的最大值广搜取每一层最大值class Solution {public: vector<int> largestValues(TreeNode* root) { queue<TreeNode*>q; q.push(root); vector<int>ans; if(!root) return ans; int mmax = INT_MI原创 2022-04-05 10:00:00 · 194 阅读 · 0 评论 -
剑指offer专项突击--第十四天
剑指 Offer II 041. 滑动窗口的平均值队列class MovingAverage {public: /** Initialize your data structure here. */ queue<int>q; int max_size; int now_size; int sum; MovingAverage(int size) { max_size = size; sum = 0;原创 2022-04-04 10:00:00 · 308 阅读 · 0 评论 -
剑指offer专项突击--第十三天
剑指 Offer II 039. 直方图最大矩形面积单调栈class Solution {public: int largestRectangleArea(vector<int>& heights) { stack<int>s;s.push(-1); int mmax = 0; for(int i = 0; i < heights.size(); i++){ if(s.empty())原创 2022-04-03 09:46:25 · 427 阅读 · 0 评论 -
剑指offer专项突击--第十二天
剑指 Offer II 036. 后缀表达式栈实现class Solution {public: int evalRPN(vector<string>& tokens) { stack<int>s; for(int i=0;i<tokens.size();i++){ if((tokens[i][0]>'9'||tokens[i][0]<'0')&&tokens[i].siz原创 2022-04-02 10:00:00 · 121 阅读 · 0 评论 -
剑指offer专项突击--第十一天
剑指 Offer II 033. 变位词组排序加哈希class Solution {public: vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<vector<string>>ans; unordered_map<string,vector<string>>mp; f原创 2022-04-01 10:26:56 · 112 阅读 · 0 评论 -
剑指offer专项突击--第十天
剑指 Offer II 030. 插入、删除和随机访问都是 O(1) 的容器用数组和map实现,当需要删除元素时将最后的元素移动到删除的元素位置class RandomizedSet {public: vector<int>num; unordered_map<int,int>mp; /** Initialize your data structure here. */ RandomizedSet() { } /** I原创 2022-03-31 11:16:46 · 846 阅读 · 0 评论 -
剑指offer专项突击--第九天
剑指 Offer II 027. 回文链表翻转后半段,然后比较class Solution {public: bool isPalindrome(ListNode* head) { ListNode* fast; ListNode* slow; fast=head; slow=head; while(fast->next&&fast->next->next){原创 2022-03-30 12:56:09 · 275 阅读 · 0 评论 -
剑指offer专项突击--第八天
剑指 Offer II 024. 反转链表从头依次翻转即可class Solution {public: ListNode* reverseList(ListNode* head) { if(!head) return head; ListNode* p=head->next; if(!p) return head; ListNode* q=head; head->next=NULL;原创 2022-03-29 10:00:00 · 122 阅读 · 0 评论 -
剑指offer专项突击--第七天
剑指 Offer II 021. 删除链表的倒数第 n 个结点双指针,一前一后,中间差n,这样当前指针结点到最后的时候需要删除的就是后指针结点class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* p,*q; ListNode pre; pre.next=head; if(head->next==NULL&am原创 2022-03-28 10:00:00 · 120 阅读 · 0 评论 -
剑指offer专项突击--第六天
剑指 Offer II 017. 含有所有字符的最短字符串两个map,循环记录当前s区间满足字符的个数,当个数等于t的长度时更新答案class Solution {public: string minWindow(string s, string t) { unordered_map<char,int>hs,ht; for(auto p:t) ht[p]++; int l=0,r=0,cnt=0; string ans原创 2022-03-27 13:37:25 · 332 阅读 · 0 评论 -
剑指offer专项突击--第五天
剑指 Offer II 014. 字符串中的变位词两个数组,一个记录原字符串字符个数,另一个遍历另一个数组更新数组值,当数组相同时即是结果class Solution {public: bool checkInclusion(string s1, string s2) { vector<int>p1(26),p2(26); if(s1.size()>s2.size()) return false; for(int i=0;i&l原创 2022-03-26 10:00:00 · 376 阅读 · 0 评论 -
剑指offer专项突击--第4天
剑指 Offer II 010. 和为 k 的子数组前缀和加哈希class Solution {public: int subarraySum(vector<int>& nums, int k) { int n=nums.size(); vector<int>pre(n+1); //pre[0]=nums[0]; unordered_map<int,int>mp; mp.原创 2022-03-25 10:42:24 · 308 阅读 · 0 评论 -
剑指offer专项突击--第3天
剑指 Offer II 007. 数组中和为 0 的三个数一层循环下双指针,需要加判重的while循环class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>>ans; int n=nums.size(); sort(nums.begin(),nums.原创 2022-03-24 10:13:14 · 298 阅读 · 0 评论 -
剑指offer专项突击--第二天
剑指 Offer II 004. 只出现一次的数字sort排序后判断class Solution {public: int singleNumber(vector<int>& nums) { if(nums.size()==1) return nums[0]; sort(nums.begin(),nums.end()); for(int i=1;i<nums.size()-1;i++){ if(原创 2022-03-23 19:31:38 · 399 阅读 · 0 评论 -
剑指offer专项突击--第一天
剑指 Offer II 001. 整数除法位运算计算当前的数值是否大于除数,更新答案class Solution {public: int divide(int a, int b) { if(a==INT_MIN&&b==-1) return INT_MAX; int flag=(a>0)^(b>0)?1:0; unsigned int ua=abs(a); unsigned int ub=abs(b)原创 2022-03-22 11:44:38 · 140 阅读 · 0 评论 -
剑指offer--第31天
剑指 Offer 14- II. 剪绳子 II将数字分成若干个三的时候乘积最大class Solution {public: int cuttingRope(int n) { long long ans=1; if(n==2) return 1; if(n==3) return 2; while(n){ if(n>=3){ if(n==4){原创 2022-03-21 11:28:42 · 95 阅读 · 0 评论 -
剑指offer--第30天
剑指 Offer 17. 打印从1到最大的n位数算出最大数,循环遍历即可class Solution {public: vector<int> printNumbers(int n) { vector<int>ans; int f=1; while(n--){ f*=10; } for(int i=1;i<f;i++) ans.push_back(i);原创 2022-03-20 10:21:39 · 298 阅读 · 0 评论 -
剑指offer--第29天
面试题19. 正则表达式匹配根据当前字符是‘*’或其他字符进行分类状态转移方程if(p[i-1]=='*') if(p[i-2]==s[i-1]||p[i-2]=='.')//如果p[i-2]==s[i-1],说明当前的*可以重复前面的字符,从而使当前字符匹配 dp[i][j]=dp[i-1][j]; dp[i][j]|=dp[i][j-2];//直接获取前两位的状态,因为可以*可以让之前的字符出现0次else if(p[i-1]==s[i-1]||p[i-1]=='.')//当前不为*时原创 2022-03-19 12:20:46 · 840 阅读 · 0 评论 -
剑指offer--第28天
剑指 Offer 37. 序列化二叉树题目要求将二叉树转化成一个字符串,然后又可以通过字符串构造出二叉树深搜出字符串,然后再深搜出二叉树即可,没时间写,附官方代码class Codec {public: void rserialize(TreeNode* root, string& str) { if (root == nullptr) { str += "None,"; } else { str +=原创 2022-03-18 09:23:23 · 97 阅读 · 0 评论 -
剑指offer--第27天
剑指 Offer 59 - I. 滑动窗口的最大值两种思路第一:将每一个区间里的降序序列下标存入双端队列,每次存入之后执行一次出队,将坐标不在当前区间里的删除,每一次入队的时候,先将小于当前值的全部出队,然后再入队,循环下来,每一次队首元素即是当前区间的最大值class Solution {public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { int n=nums.si原创 2022-03-17 10:28:45 · 94 阅读 · 0 评论 -
剑指offer--第26天
剑指 Offer 20. 表示数值的字符串先附上题解:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/cmo-ni-ti-si-lu-jian-dan-luo-ji-qing-xi-by-xiaonen/判断指数和非指数class Solution {public: bool isNumber(string s) { //1、从首尾寻找s中不为空格首尾位置,也就是去除原创 2022-03-16 13:18:17 · 46 阅读 · 0 评论 -
剑指offer--第25天
剑指 Offer 29. 顺时针打印矩阵四个循环遍历即可class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int>ans; if(matrix.size()==0||matrix[0].size()==0) return ans; int i=0,j=0,cal=matr原创 2022-03-15 08:54:38 · 117 阅读 · 0 评论 -
剑指offer--第24天
剑指 Offer 14- I. 剪绳子尽量将每个块分成长度为3class Solution {public: int cuttingRope(int n) { if(n==2) return 1; if(n==3) return 2; if(n==4) return 4; int f=n%3; int m=n/3; int ans=1; if(f==1){ f原创 2022-03-14 12:05:24 · 336 阅读 · 0 评论 -
剑指offer--第23天
剑指 Offer 39. 数组中出现次数超过一半的数字这题可以用哈希表直接求出来,但是时间会要慢一点,分析题目,一定会有一个数超过数组长度的一班,所以可以用一个数来记录当前最多的元素,一个数来记录当前最多元素的个数,遇到与当前记录的元素不同的时候,把当前记录的元素个数减一,当为0的时候更换当前记录的数,出现超过一半的数最后一定是记录的数class Solution {public: int majorityElement(vector<int>& nums) {原创 2022-03-13 09:40:10 · 1142 阅读 · 0 评论 -
剑指offer--第22天
剑指 Offer 56 - I. 数组中数字出现的次数因为一定存在两个不同的数,转换成二进制,两个不同的数一定会有相同的位上不同为1,其余相同的数异或为0,先取整体异或和,然后找到任意一个位上的1,这个1一定来自两个不同的数中间的一个,再然后通过循环来遍历和这个位置的1相与,相与为1则异或a,否则异或b,a和b则是这两个不同的数class Solution {public: vector<int> singleNumbers(vector<int>& nums)原创 2022-03-12 20:44:02 · 283 阅读 · 0 评论 -
剑指offer--第21天
剑指 Offer 15. 二进制中1的个数给定的一定是一个32为的二进制数,所以用循环计算每一位即可class Solution {public: int hammingWeight(uint32_t n) { int ans=0; for(int i=0;i<32;i++){ ans+=(n>>i&1); } return ans; }};剑指 Offer 65.原创 2022-03-11 10:15:38 · 40 阅读 · 0 评论 -
剑指offer--第20天
剑指 Offer 07. 重建二叉树本题可以参考之前的天梯赛建树这篇文章,大致思路是一样的,前序遍历的第一个一定是当前子树的头节点,而在中序遍历中,头节点两边分别为左子树和右子树,因此只需要去查询中序遍历中对应头节点的位置,继续搜索左右子树即可class Solution {public: unordered_map<int, int> index; TreeNode* dfs(int prel,int prer,int inl,int inr,vector<int&原创 2022-03-10 10:36:51 · 1202 阅读 · 0 评论 -
剑指offer--第19天
剑指 Offer 64. 求1+2+…+n本次要求不能用乘除法和循环,所以只能用递归来运算class Solution {public: int dfs(int n){ if(n==1) return 1; return n+dfs(n-1); } int sumNums(int n) { return dfs(n); }};剑指 Offer 68 - I. 二叉搜索树的最近公共祖先因为题目给定的是二叉搜索树,因此原创 2022-03-09 13:37:20 · 620 阅读 · 0 评论 -
剑指offer--第18天
剑指 Offer 55 - I. 二叉树的深度本题需要计算二叉树的深度,可以采用深搜也可以采用广搜class Solution {public: int ans=0;int cnt=0; void dfs(TreeNode* root,int p){//深搜 if(!root){ans=max(ans,p);return ;} dfs(root->left,p+1); dfs(root->right,p+1);原创 2022-03-08 09:24:00 · 102 阅读 · 0 评论 -
剑指offer--第17天
剑指 Offer 40. 最小的k个数排序,然后将前k个数存入ansclass Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { sort(arr.begin(),arr.end()); vector<int>ans; for(int i=0;i<k;i++) ans.push_back(arr[i])原创 2022-03-07 10:45:52 · 77 阅读 · 0 评论 -
剑指offer--第16天
剑指 Offer 45. 把数组排成最小的数这题只是一个简单的自定义排序,对于每两个数所转换而成的字符串,通过自定义函数返回小的那一个即可,但是在这里用bool cmp是会报错的,因为之前在codeblocks上面没有过报错,今天才知道对于sort的第三个参数是一个静态值,因此定义cmp函数时需要在前面加上staticclass Solution {public: static bool cmp(string a,string b) { return (a+b)<原创 2022-03-06 10:28:36 · 115 阅读 · 0 评论 -
剑指offer--第15天
剑指 Offer 34. 二叉树中和为某一值的路径这题是一个简单的深搜,从根节点开始往下搜索,同时判断到达当前结点时的路径和是否为给定的值,当等于给定的值时,判断是否是叶子结点,另外需要定义一个vector存储路径结点值,每找到一个满足条件的加入到ans即可class Solution {public: vector<vector<int>>ans; int v[5001]; void dfs(TreeNode* root,int target,int原创 2022-03-06 10:41:22 · 181 阅读 · 0 评论 -
剑指offer--第14天
剑指 Offer 12. 矩阵中的路径这题是判断是否能找到连接起来的指定字符串,预处理先将与字符串开头一样的字符的位置记录起来,然后从这几个位置搜索即可,当答案已经存在时,就不用再继续搜索,否则会超时class Solution {public: bool vis[201][201]; bool ans=0; int cal; int raw; void dfs(int x,int y,string s,int cnt,vector<vector<c原创 2022-03-06 10:47:43 · 79 阅读 · 0 评论 -
剑指offer--第13天
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面这个题采用双指针即可,分别指向当前奇数的位置和偶数的位置,如果奇数再后便将两者互换,否则继续后移class Solution {public: vector<int> exchange(vector<int>& nums) { if(nums.size()==0) return nums; int i=0;int j=0; while(i<nums.si原创 2022-03-06 10:55:44 · 64 阅读 · 0 评论 -
剑指offer--第12天
剑指 Offer 25. 合并两个排序的链表定义两个头,判断两者的数值大小,分别添加后移即可class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(!l1) return l2; if(!l2) return l1; ListNode* p; ListNode* ans=new ListNode(); p=an原创 2022-03-06 10:59:31 · 101 阅读 · 0 评论 -
剑指offer--第11天
剑指 Offer 18. 删除链表的节点双指针遍历,找到指定节点时对链表进行修改即可class Solution {public: ListNode* deleteNode(ListNode* head, int val) { ListNode* p=head; if(head==NULL) return NULL; if(head->val==val) return head->next; ListNode* q=h原创 2022-03-06 11:03:13 · 320 阅读 · 0 评论 -
剑指offer--第10天
剑指 Offer 46. 把数字翻译成字符串简单的动态规划,因为需要处理两位数,所以先将字符串翻转过来,首先初始化前两位数据, if(s[1]=='2'&&s[0]<='5') dp[1]=2; else if(s[1]=='1') dp[1]=2; else dp[1]=1;然后从下标2开始递推,中间分情况判断即可 if(s[i]=='2'&&s[i-1]<='5'&&原创 2022-03-06 11:18:28 · 35 阅读 · 0 评论 -
剑指offer--第9天
剑指 Offer 42. 连续子数组的最大和找到递推公式即可,判断当前值是否需要加上 f=max(f+nums[i],nums[i]);AC代码class Solution {public: int maxSubArray(vector<int>& nums) { int leng=nums.size(); int f=nums[0]; int mmax=f; for(int i=1原创 2022-03-06 11:25:56 · 91 阅读 · 0 评论