自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(112)
  • 问答 (1)
  • 收藏
  • 关注

原创 二叉树的镜像

NC72 二叉树的镜像/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可

2021-07-30 09:01:20 127

原创 NC16 判断二叉树是否对称

NC16 判断二叉树是否对称class Solution {public: /** * * @param root TreeNode类 * @return bool布尔型 */ bool judge(TreeNode *l,TreeNode *r) { if(l==NULL&&r==NULL) return true; if(l->val==r->val&a

2021-07-30 09:00:19 129

原创 NC6 二叉树的最大路径和

NC6 二叉树的最大路径和class Solution {public: int Max=INT32_MIN; int build(TreeNode *root) { if(root==NULL ) return 0; if(root->right==NULL&&root->left==NULL) { Max=max(Max,

2021-07-30 08:58:03 139

原创 NC118 数组中的逆序对

NC118 数组中的逆序对直接暴力,超时。class Solution {private: const int kmod = 1000000007;public: int InversePairs(vector<int> data) { int ret = 0; int n = data.size(); for (int i = 0; i < n; ++i) { for (int j = i +

2021-07-29 19:38:49 178

原创 NC36 在两个长度相等的排序数组中找到中位数

NC36 在两个长度相等的排序数组中找到中位数class Solution {public: int findMedianinTwoSortedAray(vector<int>& arr1, vector<int>& arr2) { // write code here if(arr1.size() == 1) return min(arr1[0],arr2[0]);///特判 int n = arr1.

2021-07-29 19:24:59 138

原创 NC102 在二叉树中找到两个节点的最近公共祖先

NC102 在二叉树中找到两个节点的最近公共祖先递归写法class Solution {public: /** * * @param root TreeNode类 * @param o1 int整型 * @param o2 int整型 * @return int整型 */ TreeNode *find(TreeNode *root,int o1,int o2) { if(root==

2021-07-29 15:11:00 106

原创 将数组分成两部分,使得这两部分的和的差最小

将数组分成两部分,使得这两部分的和的差最小将一个数组分成两部分,不要求两部分所包含的元素个数相等,要求使得这两个部分的和的差值最小。比如对于数组{1,0,1,7,2,4},可以分成{1,0,1,2,4}和{7},使得这两部分的差值最小。这个问题可以转化为求数组的一个子集,使得这个子集中的元素的和尽可能接近sum/2,其中sum为数组中所有元素的和。这样转换之后这个问题就很类似0-1背包问题了:在n件物品中找到m件物品,他们的可以装入背包中,且总价值最大不过这里不考虑价值,就考虑使得这些元素的和尽量接近s

2021-07-28 22:17:40 2341 1

原创 NC126 换钱的最少货币数

NC126 换钱的最少货币数这题类似于背包问题class Solution {public: int minMoney(vector<int>& arr, int aim) { // write code here int dp[arr.size()+10][aim+10]; arr.insert(arr.begin(), 0); // for (int i = 1; i

2021-07-28 20:34:44 79

原创 鸡蛋落地问题

1884. 鸡蛋掉落-两枚鸡蛋class Solution {public: int twoEggDrop(int n) { int i, j; int f; int dp[n + 1][3]; memset(dp, 0x3f3f3f, sizeof(dp)); for (i = 1; i <= n; i++) { dp[i][1] = i; }

2021-07-28 20:27:35 95

原创 LeetCode 1160. 拼写单词

LeetCode 1160. 拼写单词

2021-07-28 13:16:51 55

原创 NC95 数组中的最长连续子序列

NC95 数组中的最长连续子序列动态规划class Solution {public: /** * max increasing subsequence * @param arr int整型vector the array * @return int整型 */ vector<int> a; map<int,int> mp; int dp[100005]; int MLS(vector&l

2021-07-27 23:37:21 104

原创 最长无重复子数组、子串

NC41 最长无重复子数组#include<bits/stdc++.h>class Solution {public: int maxLength(vector<int>& arr) { // write code here map<int,int> mp; int i=0,j=1; mp[arr[0]]=0; int Max=1; while(j&l

2021-07-27 15:24:07 206

原创 NC126 换钱的最少货币数

NC126 换钱的最少货币数

2021-07-26 19:09:53 60

原创 NC60 判断一棵二叉树是否为搜索二叉搜索树和完全二叉树

NC60 判断一棵二叉树是否为搜索二叉搜索树和完全二叉树判断是二叉搜索树的条件是中序遍历是有序的判断是完全二叉树就是在遇到空节点之后剩余的应当全是空节点class Solution {public: vector<bool> vec; vector<int > v; void in(TreeNode *root) { if(root) { in(root->left);

2021-07-26 17:45:27 105

原创 LeetCode 662. 二叉树最大宽度

LeetCode 662. 二叉树最大宽度这道题比较坑,如果你直接按左子树,2i,右子树 2i+1,这样存的话数据会溢出。所以你需要简单操作一下。if(a->t->left) q.push(new node(a->t->left,(a->width-start+1)*2));if(a->t->right) q.push(new node(a->t->right,(a->width-start+1)*2+1));struct node{

2021-07-26 17:33:57 84

原创 LeetCode 完全平方数

LeetCode 完全平方数class Solution {public: int numSquares(int n) { int dp[n+10]; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { int Min=INT32_MAX; for(int j=1;j*j<=i;j++) {

2021-07-25 15:15:03 76

原创 旋转过的有序数组问题总结

剑指 Offer 11. 旋转数组的最小数字这个判断在左右两边尽量与r所在下标比较,不然的话特殊情况下只有是一个递增数组的话会出问题。class Solution {public: int minArray(vector<int>& numbers) { int l=0,r=numbers.size()-1; while(l<r) { int mid=(l+r)/2;

2021-07-25 14:56:41 83

原创 NC99 树的直径

NC99 树的直径这道题有个坑。这道题不是二叉树,而且还需要你自己建图。而且不可以使用二维数组建图,因为n太大。要使用领接表。同时我第一次想的是最长的路径必定是在一个叶子节点到另一个叶子节点,我找遍所有的取最大的,然后去最大的就行了,那么有几个子叶节点就需要几个dfs,那么这样还是会超时。于是,就有了,先随便找一个点搜到他的最远点,然后在从最原来搜,这次搜到就是最大的了。下面是我两次的代码,第一个是超时的。/** * struct Interval { * int start; * in

2021-07-25 00:31:18 632

原创 LeetCode 543. 二叉树的直径

LeetCode 543. 二叉树的直径通过这道题我好好思考了一下递归是如何写的。首先你要明白你这个函数式用来实现什么的,然后为了获得这个结果应该下层函数获得什么,然后在写一个递归边界就行了。顺着上面的思路想一下,我这个函数式为了计算以这个节点为边界的最长链的长度的。那么你的返回值就要是max(len1,len2)+1;递归边界是root!=NULL。这样你一个递归函数就实现了。其余的就是你写你通过这个递归函数想要做什么了。class Solution {public: int ma

2021-07-24 20:28:19 78

原创 LeetCode 662. 二叉树最大宽度

LeetCode 662. 二叉树最大宽度做题后的反思这道题太恶心了,还要考虑数据范围溢出的问题。同时通过做这道题我知道了c++中new 出来的结构体是一个指针类型的,要使用node *这种类型的对象来接收。同时,对于这种指针类型的我取值使用->,而不是点。还有就是一般值与下标有关的我们做题时要考虑直接把值与标存放在一起,使用结构体或者pair,这样更加放标解题。struct node{ TreeNode *t; long long width; node(Tre

2021-07-24 09:48:19 60

原创 LeetCode 1884. 鸡蛋掉落-两枚鸡蛋

LeetCode 1884. 鸡蛋掉落-两枚鸡蛋class Solution {public: int twoEggDrop(int n) { int i, j; int f; int dp[n + 1][3]; memset(dp, 0x3f3f3f, sizeof(dp)); for (i = 1; i <= n; i++) { dp[i][1] = i;

2021-07-23 15:36:43 157

原创 NC137 表达式求值

NC137 表达式求值中缀表达式转后缀表达式,只不过在转后缀表达式的过程中符号弹出的话直接计算出结果。符号的优先级大于符号栈栈顶符号,直接压入,优先级小于或等于符号栈栈顶符号,不断弹出符号栈元素class Solution {public: stack<int> st1; stack<char> st2; map<char,int> mp; int jisuan(char c) {

2021-07-23 00:14:15 114

原创 剑指 Offer 31. 栈的压入、弹出序列

剑指 Offer 31. 栈的压入、弹出序列

2021-07-22 22:44:19 72

原创 List用法

List用法C++中List的用法Lists将元素按顺序储存在链表中. 与双端队列相比,可以操作前后节点,以及删除中间的一些节点。与vector相比,插入删除操作更加放便。insert() 插入一个元素到list中push_back() 在list的末尾添加一个元素push_front() 在list的头部添加一个元素front() 返回第一个元素back() 返回最后一个元素pop_back() 删除最后一个元素pop_front() 删除第一个元素begin() 返回指向第一个元素的

2021-07-22 20:52:04 57

原创 LRU和LRU总结

NC93 设计LRU缓存结构list+map实现,无需自己实现链表get元素时,先判断在不在,不存在返回-1,存在的话更新list,即删除节点在原来在链表中的位置,然后在放到链表头部。set时,也是判断在不在,存在,更新一下map中的值,然后更新list,删除原理的放到list头部。class Solution {public: vector<int> LRU(vector<vector<int> >& operators, int k)

2021-07-22 20:43:40 322

原创 自定义排序方法总结

需要注意的是,set,map,priority_queue这些容器必须重载<。sort自定义的比较方法默认是大于的。一,sort排序的自定义排序方法bool cmp(node a,node b){ }二,结构体的重载里面两种都可以struct node{ int key; int value; int cnt; int time; // bool operator < (const node &a) const

2021-07-22 20:08:38 757

原创 LeetCode 39. 组合总和

LeetCode 39. 组合总和class Solution {public: vector<vector<int> > vec; void dfs(vector<int> num,int target,vector<int> v,int ans,int index) { if(ans>target) return ; if(ans==target) {

2021-07-22 14:32:32 74

原创 NC100 将字符串转化为整数

NC100 将字符串转化为整数class Solution {public: int atoi(const char *str) { long long ans=0; int flag=0; for(int i=0;str[i]!='\0';i++) { //去空格 if(str[i]=='+'||str[i]==' ') con

2021-07-22 14:14:02 140

原创 NC83 子数组最大乘积

NC83 子数组最大乘积本题要求最大子序积,是【最大子序和】的加强版,动态规划是最优解法。在最大子序和中,状态转移方程为:f(i)=max{f(i−1)+arr[i], arr[i]}f(i)是数组的局部最大子序和,求出最大的f(i)即可。最大子序积中,需要考虑负数的问题,因为一个负数乘以一个负数可能会变为最大值。于是我们维护局部最大值fmax(i)和局部最小值fmin(i),状态转移方程如下:fmax(i) = max{fmax(i-1)*arr[i], fmin(i-1)*arr[i], a

2021-07-22 13:54:25 162

原创 两数、三数之和问题

两数之和双指针两数之和问题显而意见是用双指针来写,要想使用双指针前提是数组提前有序。这道题的坑就在这里,数组无序,我们需要先排序,但是题目让返回的却是数字所在原数组的下标,如果已排序就乱了,因此有两种方法,一种就是我认为简单的我们在进行排序,只不过把下标和数组放在一起进行排序。#include<bits/stdc++.h>int vis[100100];//这里的默认为是大于号bool cmp(pair<int,int>a, pair<int,int> b)

2021-07-22 12:25:37 97

原创 NC90 包含min函数的栈

NC90 包含min函数的栈简单的双栈法常规的做法是额外添加一个同步栈(min栈),以保存记录之前所有的min值,相当于是使用了n个辅助变量,所以空间复杂度是O(n)。这里要注意min函数中必须是数据,不能是一个函数。class Solution {public: stack<int> st1; stack<int> Min; void push(int value) { st1.push(value);

2021-07-22 10:19:57 133

原创 买卖股票总结

买卖股票的最佳时机 II买卖股票的最佳时机 III思路与算法由于我们最多可以完成两笔交易,因此在任意一天结束之后,我们会处于以下五个状态中的一种:未进行过任何操作;只进行过一次买操作;进行了一次买操作和一次卖操作,即完成了一笔交易;在完成了一笔交易的前提下,进行了第二次买操作;完成了全部两笔交易。class Solution {public: int maxProfit(vector<int>& prices) { vector<

2021-07-21 20:20:57 170 1

原创 NC108 最大正方形

NC108 最大正方形你可以观察发现,如果以(i,j)为右下角的出现了正方形,那么他的(i-1,j),(i,j-1), (i-1,j-1)这几个也是正方形,我们只需要取他们最小的就行了。dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;class Solution {public: int solve(vector<vector<char> >& matrix) { // write c

2021-07-21 17:15:33 93

原创 NC82 滑动窗口的最大值

NC82 滑动窗口的最大值

2021-07-21 16:33:03 265

原创 dfs专项练习总结

对于dfs搜索,每次for循环一组数字,我们选其中一个进行搜索,按他搜索过后记得要回溯,选择其他的进行搜索。所以说,对于一次dfs函数,我们需要选择一个。如果你都不选了,进到这一个dfs也就没有了意义。一 ,NC121 字符串的排列这道题用全排列可以轻松解决。不过我不想用全排列,我想使用dfs搜索进行解决。这个是我第一次写的dfs,下面那个dfs完全没有什么意义,因为如果你不选这个节点,你可可以选其他的,for循环会向后执行,而不是你再来一个dfs来决定不选它。同时上面这个代码还没有进行去重的

2021-07-21 15:28:04 213 1

原创 最长无重复子数组

这道题可以使用双指针即滑动窗口的方法写,不过有一个好的优化过程class Solution {public: int findLength(vector<int>& nums1, vector<int>& nums2) { vector< vector<int> >dp(nums1.size()+5,vector<int> (nums2.size()+5)); nums1.insert

2021-07-21 13:04:05 42

原创 滑动窗口问题总结

滑动窗口问题一般都是一个字符串匹配s1另一个 字符串s2的问题。滑动窗口的问题一般分成一下几个步骤走:1,记录下字符串s1中的字符mp12,使用双指针的形式遍历字符串s2,同时记录下遍历的字符mp23,在遍历字符串的过程中,没次移动都比较一下mp1和mp2是否想通了,想通了就认为是匹配成功了。窗口大小不固定![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/c869adea70321e6ce51c5012d008a278.pngclass S

2021-07-21 10:56:10 170

原创 最长公共子串或子序列

要区分子串和子序列的区别NC127 最长公共子串dp[i] [j]表示两个串分别以i和j结尾的最长公共子串。这个求子串可以直接截取。class Solution {public: string LCS(string str1, string str2) { // write code here //if(str1==""||str2=="" ) return ""; str1=" "+str1;

2021-07-20 22:19:16 59

原创 NC91 最长递增子序列

NC91 最长递增子序列这道题n的范围是1e5,因此不能使用常规的dp[i],表示以i结尾的最大的子序列,因为这个时间复杂度是n方级别。因此要换一种算法。贪心+二分,时间复杂度为O(nlogn)下面说说贪心+二分的解法,举例说明基本思路,假设数组arr为[2, 3, 1, 2, 3],vec数组里面存放递增子序列,maxLen数组里存放以元素i结尾的最大递增子序列长度,那么遍历数组arr并执行如下更新规则:初始情况下,vec为[2],maxLen[1]接下来遇到3,由于vec最后一个元素小于3,直

2021-07-20 22:07:04 1020 1

原创 NC28 最小覆盖子串

NC28 最小覆盖子串 滑动窗口的思想这道题目用到了滑动窗口这一大杀器,它可以解决如下问题:最小覆盖子串(LeetCode76)字符串排列(LeetCode567)统计字母异位词(LeetCode438)最长无重复子串(LeetCode3) 滑动窗口的基本思想:用两个字典分别维护窗口中字符的统计数量、以及被求解子串中字符的统计数量用双指针遍历主字符串,双指针的初始值均为0,窗口的范围是[left, right)(左闭右开)遍历过程中,不断增大、缩小窗口,并更新状态 class So

2021-07-15 16:40:32 803

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除