剑指offer
weixin_45794299
这个作者很懒,什么都没留下…
展开
-
反转链表-剑指offer-leetcode
1、题目描述输入一个链表,反转链表后,输出新链表的表头。示例1:输入{1,2,3}返回值{3,2,1}说明:本题目包含复杂数据结构ListNode二、解题/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution{public: ListNode *ReverseList(ListNode *原创 2021-04-17 08:56:37 · 72 阅读 · 0 评论 -
手动构建二叉树
一、题目手动构建二叉树二、思路1、先new TreeNode[size]数组2、对数组中的每个val进行赋值,left和right进行置为nullptr3、从0遍历到size/2-1;根据左孩子和父节点的关系,右孩子和父节点的关系进行链接三、代码#include <iostream>#include <string.h>#include <string>#include <vector>#include <map>#incl原创 2021-09-21 22:06:34 · 239 阅读 · 0 评论 -
leetcode-剑指 Offer II 039. 直方图最大矩形面积
一、题目二、思路1、利用单调栈求出左右边界,即求出宽是多少1、建立两个stack,从左至右单调递增,从右至左单调递增2、建立两个vector,存储每个i对应的左右边界index3、当前值小于栈顶索引对应的值时,弹出栈,弹出来后,添加到vector中,栈再添加当前索引i2、计算高(当前值)*宽的最大值三、代码class Solution{public: int largestRectangleArea(vector<int> &heights) {原创 2021-09-11 12:42:20 · 132 阅读 · 0 评论 -
剑指offer-把字符串转换成整数
一、题目二、思路本题关键点:1、对输入字符串进行处理2、防止溢出,进行溢出判断3、输出时注意正数、负数三、代码class Solution {public: int strToInt(string str) { if(str.empty()) { return 0; } string nums=""; if(str[0]!=' ' && str[0]!='-'原创 2021-08-20 17:32:28 · 98 阅读 · 0 评论 -
剑指offer-字符串中的变位词
一、题目二、思路哈希表+双指针1、哈希表存储对应字符个数2、如果两个字符串是变位词,那么他们的哈希表应该是一样的,所以一+一-应该是都为03、双指针,指针的窗口大小为len,两个指针同时向右移动4、在每个窗口内,要判断哈希表中的值是不是为0,如果都为0则直接返回true,如果不是就把窗口往右移动三、代码class Solution{public: bool checkInclusion(string s1, string s2) { if (s1.le原创 2021-08-19 16:39:44 · 83 阅读 · 0 评论 -
leetcode-124. 二叉树中的最大路径和--不一定从根节点开始
一、题目二、思路1、当做最大和连续子数组来求解,找两条路径中最大值这题目的难点在于理解题意和转化题意。我们可以结合 数组的最大子数组和 的思路去解题。1. 「可以从任意节点出发, 到达任意节点」 的路径, 一定是先上升( 0 ~ n 个)节点, 到达顶点, 后下降( 0 ~ n 个)节点。 我们可以通过枚举顶点的方式来枚举路径。 2. 我们枚举顶点时, 可以把路径分拆成3部分: 左侧路径、右侧路径和顶点。 如下面的路径, 顶点为 20, 左侧路径为 6 ->原创 2021-08-18 20:20:26 · 107 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树-根据前序、中序遍历构建二叉树,返回根节点
一、题目二、思路三、代码/** * 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* buil原创 2021-08-18 12:01:44 · 38 阅读 · 0 评论 -
剑指offer-剑指 Offer II 041. 滑动窗口的平均值
一、题目二、思路1、自己定义数据结构,定义滑动窗口大小、定义窗口的总和、定义储存滑动窗口的数据2、初始化数据结构3、当前数量没有达到窗口最大数量,当前数量达到窗口最大数量,把最前一个删除三、代码class MovingAverage {public: /** Initialize your data structure here. */ MovingAverage(int size) { m_size=size; m_sum=0; }原创 2021-08-11 14:44:04 · 97 阅读 · 0 评论 -
剑指offer-剑指 Offer II 084. 含有重复元素集合的全排列-set去重-swap-dfs
一、题目二、思路1、利用dfs递归2、利用set进行去重,每次递归的都是不重复的数,first达到size时,就添加到输出容器3、swap交换,每次递归前,都将nums[fitrst]与nums[i]进行交换,递归完之后又交换回去三、代码class Solution {public: vector<vector<int>> permuteUnique(vector<int>& nums) { vector<int>原创 2021-08-10 19:03:19 · 166 阅读 · 0 评论 -
剑指offer-剑指 Offer II 074. 合并区间-先sort排序,然后比较数组中最后一个和待添加进来的第一个的大小
一、题目二、思路三、代码class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { vector<int>res; vector<vector<int>>OutPut; if(intervals.empty()) {原创 2021-08-10 10:01:27 · 102 阅读 · 0 评论 -
leetcode-剑指 Offer II 105. 岛屿的最大面积
一、题目二、思路1、遍历数组,找到值为1的,然后进行dfs递归2、在dfs中,先判断边界,边界不符合的直接返回,临时岛屿面积TempS++;将访问过的涂黑3、向上、向左、向右、向下迭代4、在函数中,进行岛屿面积的实时比较,临时岛屿面积是引用传递,比较完后又置为0三、代码class Solution {public: int maxAreaOfIsland(vector<vector<int>>& grid) { if(grid.emp原创 2021-08-07 10:05:30 · 115 阅读 · 0 评论 -
剑指offer-JZ27 字符串的排列
一、题目二、思路总体思路分析:每一次选择,都从所有现存字符中不重复的选择一个添加到字符串三、代码class Solution {public: vector<string>res; vector<string> Permutation(string str) { if(str.empty()) { return res; } string tmp;原创 2021-07-21 13:54:16 · 67 阅读 · 0 评论 -
剑指offer-复杂链表的复制
一、题目二、思路方法:哈希表利用哈希表的查询特点,考虑构建 原链表节点 和 新链表节点 的键值对映射关系,再遍历构建新链表各节点的 next 和 random 引用指向即可。算法流程:1.若头节点 head 为空节点,直接返回 nullnull ;2.初始化: 哈希表 dic , 节点 cur 指向头节点;3.复制链表:建立新节点,并向 dic 添加键值对 (原 cur 节点, 新 cur 节点) ;cur 遍历至原链表下一节点(按next节点遍历);4.构建新链表的引用指向:构建原创 2021-07-06 14:48:38 · 33 阅读 · 0 评论 -
剑指offer-二叉搜索树的后序遍历序列
一、题目二、思路1、最后一个是根节点,传入vector容器,左边界,根节点2、递归调用,找出左子树、右子树,分别递归调用;如果值小于根节点,则++;如果值>根节点,记录下来,++判断++后的是不是和right相同,不相同就返回false;为真的情况:左边界>=根节点;三、代码class Solution {public: bool verifyPostorder(vector<int>& postorder) { return d原创 2021-07-05 22:18:13 · 34 阅读 · 0 评论 -
leetcode-剑指 Offer 50. 第一个只出现一次的字符
一、题目二、思路1、用哈希表存储对应字符的个数2、再遍历一遍字符串,找到第一个数量为1的字符返回三、代码class Solution {public: unordered_map<char,int>dic; char firstUniqChar(string s) { char str=' '; if(s.empty()) { return str; } for(原创 2021-07-03 22:05:35 · 35 阅读 · 0 评论 -
leetcode-剑指 Offer 13. 机器人的运动范围
一、题目二、思路01海岛的变形参考01海岛三、代码class Solution {public: int Count=0; vector<vector<int>>res; vector<int>nic; int movingCount(int m, int n, int k) { for(int i=0;i<m;++i) { for(int j=0;j<n;原创 2021-07-03 21:57:23 · 45 阅读 · 0 评论 -
剑指offer-JZ54 字符流中第一个不重复的字符
一、题目二、思路建立两个容器,一个哈希容器,用来方便查找字符的位置;一个vector容器,记录每个字符出现了多少次,最后遍历的时候只需要找到次数等于1的字符返回三、代码class Solution{public: //Insert one char from stringstream unordered_map<char,int>dic; vector<pair<char, int>>res; int Count=0; v原创 2021-07-03 21:07:03 · 53 阅读 · 0 评论 -
剑指offer-剑指 Offer 49. 丑数
一、题目二、思路总体思路,能满足丑数要求的一定是前面丑数的2倍、3倍、5倍中的一个;然后用a,b,c三个数来分别表示当前是2的几倍,3的几倍,5的几倍三、代码class Solution{public: int nthUglyNumber(int n) { int a = 0, b = 0, c = 0; vector<int> dp(n); int Count = 1; dp[0] = 1;原创 2021-07-03 17:19:51 · 49 阅读 · 0 评论 -
剑指offer-JZ53 表示数值的字符串
一、题目二、思路把所有情况考虑到,先把给出实例的情况考虑到,一个一个添加条件对应解决三、代码class Solution{public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param str string字符串 * @return bool布尔型 */ vector<char> res; bool isNumeric(string原创 2021-07-03 11:34:15 · 48 阅读 · 0 评论 -
剑指offer-JZ67 剪绳子
一、题目二、思路1、拆分成相等的数时乘积最大,比如长方形周长为10,求最大面积;5*5为最大面积2、这里拆分成m段,假设拆分后每段长x,列公式求导3、由求导可知,当x=2或者学时满足条件,但是f(2)<f(3),所以选择x=3;4、对于n/x不能整除的,取余判断三、代码class Solution {public: int cutRope(int number) { if(number==2 || number==1) {原创 2021-07-02 16:33:24 · 53 阅读 · 0 评论 -
剑指offer-JZ41 和为S的连续正数序列
一、题目二、思路思路1:穷举法,两层for循环遍历,第一层只需要小于等于sum/2思路2:滑动窗口法思路3:求和公式+循环三、思路一代码class Solution {public: vector<vector<int> > FindContinuousSequence(int sum) { vector<int>res; vector<vector<int>>Output;原创 2021-07-02 15:00:43 · 58 阅读 · 0 评论 -
剑指offer-JZ40 数组中只出现一次的两个数字
一、题目二、思路1、哈希表添加数字出现的个数,dic[array[i]]++;2、再遍历一遍哈希表,找到值等于1的两个数,添加到vector容器中3、对vector容器sort排序三、代码class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型vector * @return int整型vector原创 2021-07-02 11:13:42 · 94 阅读 · 0 评论 -
剑指offer-JZ37 数字在升序数组中出现的次数
一、题目二、思路二分法先用二分法找到数据k,然后往前和往后再查找等于k的,统计个数三、代码class Solution {public: int GetNumberOfK(vector<int> data ,int k) { if(data.empty()) { return 0; } int left=0; int right=data.size()-1;原创 2021-07-02 11:05:19 · 45 阅读 · 0 评论 -
剑指offer-JZ42 和为S的两个数字
一、题目二、思路1、思路一,O(n^2)2、哈希,O(n)三、代码一class Solution {public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { vector<int>res; if(array.empty()) { return res; } int rig原创 2021-06-29 22:52:03 · 53 阅读 · 1 评论 -
剑指offer-JZ43 左旋转字符串
一、题目二、思路1、利用substr公式2、左移的n为复制出来,然后删除原str字符串中的前n位3、将复制出来的拼接到str字符串的后面三、代码class Solution {public: string LeftRotateString(string str, int n) { string res=""; if(str.length()==0) { return res; }原创 2021-06-29 11:18:37 · 72 阅读 · 0 评论 -
剑指offer-JZ46 孩子们的游戏(圆圈中最后剩下的数)
一、题目二、思路1、本质是对从0到n-1这些数循环,然后找到m-1这个数,删除掉2、因此思路为将0到n-1放到vector容器中,然后里面for循环遍历,外面while循环3、Count计数不断累加,当Count==m-1时清0,重新开始计数4、退出条件为vector容器大小为1三、代码class Solution {public: int LastRemaining_Solution(int n, int m) { if(n<=0 || m<=0 )原创 2021-06-29 11:12:18 · 59 阅读 · 0 评论 -
剑指offer-JZ47 求1+2+3+...+n
一、题目二、思路因为题目限制,不能用求和公式,也不能用for循环求和,只能用递归而递归的推出条件为n>1,这样就不会继续进入递归了三、代码class Solution {public: int Count=0; int Sum_Solution(int n) { Count+=n; bool x=n>1 && Sum_Solution(n-1); return Count; }};...原创 2021-06-29 09:15:37 · 50 阅读 · 0 评论 -
LeetCode-剑指offer-JZ35 数组中的逆序对-归并排序
一、题目二、思路思路一:冒泡排序冒泡排序交换的次数即为逆序对的个数,但是冒泡排序的复杂度为O(n^2),会超时,这里还是把代码附上三、思路一(冒泡排序,超时)class Solution {public: int InversePairs(vector<int> data) { if(data.empty()) { return 0; } //冒泡排序 int Count原创 2021-06-28 23:00:53 · 54 阅读 · 1 评论 -
牛客网-JZ21 栈的压入、弹出序列
一、题目二、思路1、新建一个栈,把入栈元素逐个添加进去,判断栈顶元素和出栈元素的首个是否相等,如果相等则出栈,并删除入栈元素中的首个元素2、最后判断出栈元素是否还有三、代码class Solution{public: bool IsPopOrder(vector<int> pushV, vector<int> popV) { if(pushV.empty() || popV.empty()) {原创 2021-06-22 21:34:50 · 78 阅读 · 0 评论 -
牛客网-树的子结构
一、题目二、思路1)在HasSubtree中,如果pRoot1nullptr || pRoot2nullptr,直接返回false2)当pRoot1->val==pRoot2->val时,调用tree函数,进入递归tree函数递归条件:如果pRoot2==nullptr,返回true如果pRoot1==nullptr || pRoot1->val!=pRoot2->val,返回false;其余tree(pRoot1->left,pRoot2->left)原创 2021-06-17 22:15:20 · 58 阅读 · 0 评论 -
牛客网-顺时针打印矩阵
一、题目二、思路1)新建四个变量,top、botton、left、right,分别代表上下左右四个边界2)while循环,循环一次即环绕一次,while条件为top边界<=(matrix.size()-1)/2 && left边界<=(matrix[0].size()-1)/2)3)每一次循环从左到右遍历,遍历完,top++从上到下遍历,遍历完,right–从由到左遍历,条件加上top<=botton从下到上遍历,条件加上left<=right原创 2021-06-17 21:05:46 · 44 阅读 · 0 评论 -
牛客网-调整数组顺序使奇数位于偶数前面
一、题目二、思路1)新建两个vector容器,一个添加奇数,另一个添加偶数2)将添加偶数的容器插入到添加奇数容器的尾部三、代码class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型vector * @return int整型vector */ vector<int> reOrd原创 2021-06-17 20:03:54 · 70 阅读 · 0 评论 -
牛客网-数值的整数次方
一、题目二、思路1)指数为正数,连乘2)指数为负数,连乘,最后返回1/乘数三、代码class Solution {public: double Power(double base, int exponent) { double Count=1; if(exponent==0) { return 1; } else if(exponent>0) {原创 2021-06-16 16:14:15 · 44 阅读 · 0 评论 -
牛客网-二进制中1的个数
一、题目二、思路对于整数,两种方法– 1、取余法将n取余,统计为1的个数– 2、向右移位法将n&1,当不为0时,说明这个位是1;然后n>>1;向右移位,左边补0;对于负数,向右移位,但是注意左边是补1的,不是补0三、代码class Solution {public: int NumberOf1(int n) { int pos=0; int Count=0; if(n==0) {原创 2021-06-16 15:46:50 · 61 阅读 · 0 评论 -
牛客网-矩形覆盖
一、题目二、思路关键:找到规律,动态规划从第三个开始,dp[i]=dp[i-1]+dp[i-2];三、代码class Solution {public: int rectCover(int number) { if(number==0) { return 0; } else if(number==1) { return 1; }原创 2021-06-16 14:36:02 · 48 阅读 · 0 评论 -
牛客网-替换空格
一、题目二、思路新建一个字符串,当碰到非’ '时添加进去,碰到空格时添加"%20"三、代码class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return string字符串 */ string replaceSpace(string s) { string Out原创 2021-06-16 11:23:46 · 45 阅读 · 0 评论 -
leetcode-二维数组中的查找
一、题目二、思路参考官方给的思路即:从右上角开始,判断相等就直接返回true;目标值大,则往下移动一行;如果目标值小,则往左边移动三、代码class Solution {public: bool Find(int target, vector<vector<int> > array) { if(array.empty()) { return false; } if(arra原创 2021-06-16 09:22:17 · 64 阅读 · 0 评论 -
牛客网-二叉搜索树的第k个结点
一、题目二、思路1、返回二叉树中符合要求的节点先序遍历,添加值到vector容器中,用STL中partial_sort函数排序,把前k个小的元素放前k位,然后得出*(res.begin()+k-1)为所找的值;再进行一遍前序遍历,找到与这个相等的值就返回2、新建一个节点,这个节点的值为符合要求的值,返回这个节点先序遍历,添加值到vector容器中,用STL中partial_sort函数排序,把前k个小的元素放前k位,然后得出*(res.begin()+k-1)为所找的值;新建一个节点,返回原创 2021-06-15 19:03:33 · 43 阅读 · 0 评论 -
牛客网-构建乘积数组
一、题目二、思路暴力解法:两个for循环遍历三、代码class Solution {public: vector<int> multiply(const vector<int>& A) { vector<int>res; for(int i=0;i<A.size();++i) { int x=1; for(int j=0;j<A.size原创 2021-06-15 18:58:05 · 40 阅读 · 0 评论 -
牛客网-不用加减乘除做加法
一、题目二、思路利用++和–来实现加法三、代码class Solution {public: int Add(int num1, int num2) { if(num1<num2) { while(num1 !=0) { num2++; num1--; } return num2;原创 2021-06-15 15:30:34 · 32 阅读 · 0 评论