牛客网刷题
weixin_45794299
这个作者很懒,什么都没留下…
展开
-
leetcode-牛客-最长上升子序列(三)-最长递增子序列(求出具体的递增子序列,不是个数)-动态规划
一、题目二、思路1、动态规划,在求出最长递增子序列个数的基础上,找到具体的值2、先求出长度3、找到dp[i]等于当前长度的值,添加到输出容器三、代码class Solution {public: /** * retrun the longest increasing subsequence * @param arr int整型vector the array * @return int整型vector */ vector<int&原创 2022-04-21 22:32:08 · 215 阅读 · 0 评论 -
leetcode-198. 打家劫舍-动态规划-要么不选要么选
一、题目二、思路1、动态规划,要么选要么不选,dp[i]可以从max(dp[i-2]+nums[i],dp[i-1]);来三、代码class Solution {public: int rob(vector<int>& nums) { int size=nums.size(); if(size==0){ return 0; } else if(size==1){原创 2022-03-05 23:14:54 · 298 阅读 · 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 · 238 阅读 · 0 评论 -
leetcode-NC38 螺旋矩阵
一、题目二、思路1、从左至右,从上到下,从底部右边到左边,从下到上遍历2、设定四个量,int left = 0;int right = matrix[0].size() - 1;int top = 0;int bottom = matrix.size() - 1;3、特别注意right = matrix[0].size() - 1;指的是行数4、while循环遍历,条件:left <= right && top <= bottom5、从右往左,下往上时fo原创 2021-08-27 15:24:46 · 53 阅读 · 0 评论 -
牛客网-LFU
一、题目二、思路1、自定义结构体存储信息,set+哈希表实现2、set利用函数对象自定义排序规则三、代码struct Node{ int keys; int values; int val; int time;};class cmp{public: bool operator()(const Node &a, const Node &b) { if (a.val != b.val) {原创 2021-08-16 23:17:03 · 54 阅读 · 0 评论 -
LeetCode设计LRU缓存结构
一、题目二、思路1、分为get和put两个函数,get获取value值,put添加进去2、采用list双链表和unordered_map哈希表,同时维护更新3、容器定义在private,另外设置容量大小三、代码class Solution {public: /** * lru design * @param operators int整型vector<vector<>> the ops * @param k int整型 the k原创 2021-08-14 17:13:37 · 92 阅读 · 0 评论 -
牛客网-NC111 最大数
一、题目二、思路1、排序,转换为字符进行排序,如果是第一个字符不相同的,直接按照字符大小进行排序2、第一个字符相同的,把两个字符拼接起来,然后按照字符从大到小排序返回3、拍完序后,考虑vector的第一个容器为0的情况,这时直接返回“0”;4、遍历vector容器中的每个数字,将其转换为字符串进行拼接输出关键点:在排序规则里面,当第一个字符相同时,对两个字符进行拼接,返回字符最大的那个;考虑所有字符为0的情况三、代码class Solution {public: /**原创 2021-08-12 21:02:11 · 184 阅读 · 0 评论 -
leetcode-牛客网-NC18 顺时针旋转矩阵-二维数组
一、题目二、思路1、新建n*n的矩阵2、原数组的第i列变成新数组的第i行三、代码class Solution {public: vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) { vector<vector<int>>res(n,vector<int>(n,0)); if(n==0 ||原创 2021-08-11 23:53:48 · 434 阅读 · 0 评论 -
牛客网-NC82 滑动窗口的最大值
一、题目二、思路方法一:利用max_element函数求得窗口中最大值方法二:采用优先队列优先队列存储pair键值对,num[i]和i当优先队列的头的序号不在窗口范围内,就弹出三、代码max_elementclass Solution {public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int>res;原创 2021-08-11 12:30:57 · 74 阅读 · 0 评论 -
牛客网-NC1 大数加法
一、题目二、思路方法一:将每一位进行相加,考虑所有情况1、判断是否为空2、将s置为最长的字符串3、遍历s与t公共的部分,进行进位相加4、当进制为1,遍历相加s与t的非公共部分5、当进制为1,在s最前面加1方法二:改进,将s和t分别倒置,先求公共部分,再求s独有部分,最后判断进制位是否为1三、代码class Solution{public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和原创 2021-08-11 09:35:49 · 88 阅读 · 0 评论 -
K 个一组翻转链表- 链表中的节点每k个一组翻转-反转链表-LeetCode
一、题目二、思路1、先统计总结点个数,将其分组2、对每一组进行反转,反转方式为三个指针3、建立两个容器,统计每个分链表的第一个和最后一个节点3、将两个容器连接起来三、代码/** * struct ListNode { * int val; * struct ListNode *next; * }; */class Solution {public: /** * * @param head ListNode类 * @param k in原创 2021-08-10 23:05:21 · 52 阅读 · 0 评论 -
92. 反转链表 II- 链表内指定区间反转-leetcode
一、题目二、思路1、新建一个节点2、找到反转链表的前驱节点3、三个指针进行链表反转4、将反转链表的第一个节点指向cur;将前驱节点指向pre三、代码/** * struct ListNode { * int val; * struct ListNode *next; * }; */class Solution {public: /** * * @param head ListNode类 * @param m int整型 *原创 2021-08-10 22:18:45 · 179 阅读 · 0 评论 -
leetcode-牛客网-NC133 链表的奇偶重排-后面部分
一、题目二、思路1、构建奇数位节点、偶数位节点2、将奇数位节点添加到奇数位上,偶数位节点添加到偶数位上3、将两者链接起来三、代码/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接原创 2021-08-10 19:29:31 · 51 阅读 · 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 · 165 阅读 · 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 · 100 阅读 · 0 评论 -
牛客网-NC109 岛屿数量
一、题目二、思路1、遍历数组,找到’1’的值,传入dfs函数,然后数量+1(因为在dfs函数中,如果碰到为’1’,会直接把这个’1’变成其他字符,并且不会再变回来)2、dfs函数中,先判断边界条件是否符合,判断是否为’1’;3、进行dfs迭代三、代码class Solution {public: /** * 判断岛屿数量 * @param grid char字符型vector<vector<>> * @return int整型原创 2021-08-07 09:40:17 · 92 阅读 · 0 评论 -
牛客网-NC17 最长回文子串的长度
一、题目二、思路1、最长回文子串,不是最长回文子序列;最长回文子串是要连续的最长回文子序列可以不连续2、采用补充“#”的方法,使整个字符串都是奇数个3、for循环遍历,每一个都往左右两边扩散,找到相等的,并且不为“#”的就加进去如果不相等就进行下一个判断三、代码class Solution{public: int getLongestPalindrome(string A, int n) { if (n == 0 || n == 1)原创 2021-08-03 15:04:09 · 161 阅读 · 0 评论 -
leetcode-牛客网-NC127 最长公共子串-连续的子串
一、题目二、思路1、求的的是两个字符串的公共子串,子串是连续的2、构建二维动态数组,记录最长的子串,都初始化为03、当两个字符相等时,dp[i][j]=dp[i-1][j-1]+1;4、实时比较最长的子串,记录子串的最后一位的下标三、代码class Solution {public: /** * longest common substring * @param str1 string字符串 the string * @param str2 strin原创 2021-08-03 14:08:45 · 256 阅读 · 0 评论 -
leetcode-42. 接雨水-双指针-哪个指针小就移动哪个指针
一、题目二、思路采用动态规划:1、求出每一个柱子可以接的水2、这个柱子可以接的水为它左边和右边的最大值中的小的一个,然后再减去它当前的值步骤:1、新建两个数组,分别用来保存当前节点左边的最大值和当前节点右边的最大值2、再遍历一遍原数组,从1到size-1,计算它左边的最大值和右边的最大值中的小的一个,然后再减去当前值三、代码class Solution {public: int trap(vector<int>& height) { if(h原创 2021-07-29 18:40:51 · 74 阅读 · 0 评论 -
2021-07-28
一、题目二、思路层序遍历1、建立双端队列容器,添加根节点2、当从左往右添加时,添加头结点的值,从头尾部插入新节点,先插入头结点的左子节点、在插入右子节点;3、当从右往左添加时,添加尾节点的值,从头部插入新节点,先插入头结点的右子节点、在插入左子节点;三、代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :原创 2021-07-28 15:01:38 · 28 阅读 · 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 · 66 阅读 · 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-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 · 47 阅读 · 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 · 51 阅读 · 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 · 93 阅读 · 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 · 70 阅读 · 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 · 49 阅读 · 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 · 52 阅读 · 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 评论