自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(117)
  • 收藏
  • 关注

原创 查询一个区间内小于等于k的数字的个数-树状数组

// 本代码为查询区间内为小于h的数字的个数 // 改成等于h的数字的个数很简单 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int MAXM = 1e5 + 5; struct Node { int num, id; bool op

2021-06-07 00:23:46 978

原创 42. 接雨水 分治

题解 执行用时:8 ms, 在所有 C++ 提交中击败了69.41%的用户 内存消耗:13.9 MB, 在所有 C++ 提交中击败了54.33%的用户 分治思路。 首先我们要找到[left,right]中最高的那个柱子的位置记为maxIndex,把它作为last。 什么叫last?我们下面体会一下。 下面我们只需要在[left,maxIndex-1]中找到最高的柱子,位置记为leftIndex,在[maxIndex+1,right]中找到最高的柱子,位置记录为rightIndex,我们这个时候可以res

2021-05-26 15:46:37 285

原创 1033 To Fill or Not to Fill (25 分) 贪心算法

思路 刚开始想到的是dp,想不出来。 其实贪心就可以解决。 假设当前车在站点i,车中有油cur_oil,那么当前车可以行驶的距离未cur_oil*Davg,现在考虑在站点i冲不冲油,冲多少油? 当前的油量cur_oil不足以到达下一个站点,需要充油,怎么冲油,转到2中处理 当前站点接下来的若干个站点中,也就是cur_oil这些油量可以到达的站点中,没有油价比当前便宜的站点,需要在当前站点充油,怎么充油,转到2中处理 当前站点的油量cur_oil可以到达的所有站点中,有站点的油价比当前站点便

2021-05-19 20:19:04 242

原创 1033 To Fill or Not to Fill (25 分) 贪心算法

思路 刚开始想到的是dp,想不出来。 其实贪心就可以解决。 假设当前车在站点i,车中有油cur_oil,那么当前车可以行驶的距离未cur_oil*Davg,现在考虑在站点i冲不冲油,冲多少油? 当前的油量cur_oil不足以到达下一个站点,需要充油,怎么冲油,转到2中处理 当前站点接下来的若干个站点中,也就是cur_oil这些油量可以到达的站点中,没有油价比当前便宜的站点,需要在当前站点充油,怎么充油,转到2中处理 当前站点的油量cur_oil可以到达的所有站点中,有站点的油价比当前站点便

2021-05-19 19:40:07 255

原创 1203. 项目管理 双重拓扑排序

思路 执行用时:180 ms, 在所有 C++ 提交中击败了30.89%的用户 内存消耗:49.9 MB, 在所有 C++ 提交中击败了68.58%的用户 [题解](???? 1203. 项目管理 - 项目管理 - 力扣(LeetCode) (leetcode-cn.com)) 这题的关键就是想到首先要给组进行拓扑排序。 时间复杂度分析 一次遍历给-1的不需要合作的项目分配组好O(n)O(n)O(n) 两次建图O(n) 两次拓扑排序O(n+e)O(n+e)O(n+e),遍历所有的点+边 一次合并O(n)O(

2021-05-04 15:24:50 213

原创 面试题 10.09. 排序矩阵查找 简单题

思路 多加了个vector<vector<int>>vector<vector<int>>vector<vector<int>>的赋值导致一直超时,疑惑人生。 最简单的思路,从右上角或者左下角进行搜索,例如右上角,当matrix[i][j]<targetmatrix[i][j]<targetmatrix[i][j]<target时候,i++i++i++,否则j−−j--j−−,寻找等于的数字。 代码 class S

2021-04-22 15:50:56 172

原创 剑指 Offer 36. 二叉搜索树与双向链表 中序遍历,转化成双向循环链表

剑指 Offer 36. 二叉搜索树与双向链表 思路 思路,中序遍历的时候顺便修改left和right的指针。 官方题解 代码 class Solution { public: Node*head=NULL,*pre=NULL; void solve(Node*root){ if(root==NULL){ return; } solve(root->left); if(pre!=NULL){

2021-04-21 15:42:19 171

原创 932. 漂亮数组 分治策略,思维题

932. 漂亮数组 分治的思想,怎么解决? 首先一个数组a[]是漂亮数组,代表n个元素1,2,…,n的排列满足 任意的i,j,k,i<k<j, 都不存在2∗a[k]=a[i]+a[j]2*a[k]=a[i]+a[j]2∗a[k]=a[i]+a[j] 首先我们注意到,上面式子的左边必定是偶数,那么如果右边必定是奇数,满足条件。 怎么满足左边必定是偶数,右边必定是奇数,将1,2,3,…,n这n个数字分成两个部分,左边全放奇数,右边全放偶数,这样就可以,这样的话如果i在左边,j在右边,

2021-04-21 00:17:30 194

原创 241. 为运算表达式设计优先级

思路 $vector diffWaysToCompute(string expression) $代表表达式可以计算出的所有的值。 那么进行递归运算即可。 其实所有的答案就是卡特兰序列进出栈产生的所有的出栈序列的值。 看了一下没写,原代码[在这](Python/Golang 分治算法 - 为运算表达式设计优先级 - 力扣(LeetCode) (leetcode-cn.com)) 代码 class Solution { public: vector<int> diffWaysToCom

2021-04-20 00:09:37 165

原创 567. 字符串的排列 滑动窗口,简单题

思路 设置一个字符数组a[26]保存s1所有的字符出现的次数 设置一个字符数组b[26]保存滑动窗口内吗,s2所有的满足条件的字符出现的次数,什么叫**满足条件?**就是[left,right)的范围内满足包含b中的字符。 具体看代码,思路不难。 代码 执行用时:4 ms, 在所有 C++ 提交中击败了96.20%的用户 内存消耗:7.1 MB, 在所有 C++ 提交中击败了81.89%的用户 class Solution { public: int a[26]={0},b[26]={0};

2021-04-15 23:00:11 131

原创 1040. 移动石子直到连续 II 思维题

1040. 移动石子直到连续 II 思维题 思路 思路 有补充的思路在代码注释中阐明。 代码 执行用时:16 ms, 在所有 C++ 提交中击败了95.45%的用户 内存消耗:11.9 MB, 在所有 C++ 提交中击败了59.09%的用户 class Solution { public: // 缩小左边端点和右边端点的距离 vector<int> numMovesStonesII(vector<int>& stones) { int n=st

2021-04-15 22:59:07 271

原创 424. 替换后的最长重复字符 滑动窗口,好题

解题思路 原本的解题思路,枚举最长字符串的第一个字符,然后不断向后寻找最长的字符串,思路错误,因为s里面的字符不一定是最长字符串的第一个字符。 正确的思路:滑动窗口 设置一个left指针,一个right指针: left=right=0; 设置一个res=0,记录我们的结果。 设置maxCharNum维护窗口中也就是[left,right)区间内的出现最多的字符的个数,这样剩下的字符个数就是remain=right-left-maxCharNum,当remain<k的时候,所有的字符可以被替换,

2021-04-13 15:14:16 158

原创 395. 至少有 K 个重复字符的最长子串 分治或者滑动窗口

思路 分治的解法 明白这么的一个基本的事实,给定一个字符串s,如果s中存在一个字符c,这个字符c在整个s中出现的次数<k,那么我们所要求得最长字串必定不包含这个这个字符c,于是我们便可以把这个字符串从c这个字符开始分成若干个部分,对这个若干个部分重复上面得操作,进行分治。 和一般分治得一点变形就是这个分治划分子问题的方法,需要想到这一点。 执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户 内存消耗:6.4 MB, 在所有 C++ 提交中击败了60.95%的用户

2021-04-12 22:14:23 246

原创 23. 合并K个升序链表 堆的简单应用

思路 堆中存放的元素就存放链表第一个元素的指针,排序方式按照第一个元素指针指向的元素的大小来排序,比较简单,直接放代码。 初次建堆时间复杂度O(nlogn),n是所有链表长度O(nlogn),n是所有链表长度O(nlogn),n是所有链表长度,下面每获取一个元素调整堆的时间复杂度O(logn)O(logn)O(logn),总的时间复杂度O(nlogn)O(nlogn)O(nlogn)。 执行用时:36 ms, 在所有 C++ 提交中击败了49.24%的用户 内存消耗:13 MB, 在所有 C++ 提交中击败

2021-04-08 23:34:42 145

原创 264. 丑数 II 最小堆或者是三指针

思路 和”面试题 17.09. 第 k 个数 最小堆或者是三指针“一样。 代码 class Solution { public: // int nthUglyNumber(int n) { // // 指示所有乘以2,3,5得到的数字 // int k1=0,k2=0,k3=0; // vector<int>vs(n+1); // vs[0]=1; // int minn=1; // for(

2021-04-08 23:01:16 154

原创 215. 数组中的第K个最大元素 简单的堆排

解题思路 简单的堆排,时间复杂度lognlognlogn 代码 class Solution { public: int findKthLargest(vector<int>& nums, int k) { int n=nums.size(); if(k>n){ return 0; } make_heap(nums.begin(),nums.end(),less<int>()

2021-04-08 22:15:06 137

原创 面试题 17.09. 第 k 个数 最小堆或者是三指针

思路 想写筛法,失败 见leetcode题解。 思路,只需要求1和3,5,7的任意(3, 5, 7)倍的数才是满足要求的。 两种方式,一种是维护一个最小堆,堆顶存放上面的满足要求的数,需要对数字去重 一个是维护三个指针: (来自leetcode) vector<int>nums(k+1); nums[0] = 1; int i3 = 0; int i5 = 0; int i7 = 0; // 遍历一共k-1次 for (int i = 1; i < k; ++i) {

2021-04-07 20:48:45 146

原创 Chapter07Graph

Chapter07Graph

2021-03-31 14:49:07 139

原创 图汇总

Chapter07Graph.md

2021-03-26 00:24:20 122

原创 Chapter08Searching.md

here

2021-03-22 22:43:55 139

原创 c++ STL容器的使用

make_heap()等的使用 c++ STL容器中heap的使用 本文介绍如何使用STL里的heap(堆)算法。第一次接触heap这种数据结构是在大学的数据结构教材上,它是一棵完全二叉树。在STL中,heap是算法的形式提供给我们使用的。包括下面几个函数: make_heap: 根据指定的迭代器区间以及一个可选的比较函数,来创建一个heap. O(N) push_heap: 把指定区间的最后一个元素插入到heap中. O(logN) pop_heap: 弹出heap顶元素, 将其放置于区间末尾. O(l

2021-03-22 20:21:43 159

原创 124. 二叉树中的最大路径和 树形dp,最大深度

思路 c++,动态规划,递归。 树形dp。 官方题解: 作者:LeetCode-Solution 链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/er-cha-shu-zhong-de-zui-da-lu-jing-he-by-leetcode-/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 首先,考虑实现一个简化的函数 maxGain(node),该

2021-03-19 19:00:56 199

原创 1021 Deepest Root (25 分) dfs, 好题,树形dp,求树的深度

解体思路 寻找到所有的叶子节点,进行dfs,记录深度,最后输出即可。、 又犯了zz错误,自罚三杯。 代码 #include<cstdio> #include<iostream> #include<algorithm> #include<vector> using namespace std; int n; struct Node{ int v; Node(int v_=0):v(v_){} }; vector<vector<N

2021-03-19 18:59:30 139

原创 第九章-内部排序

Chapter 09 Internal sorting Definition Stable and Unstable Insertion based sorting Straight inserting based sorting 从小到达排序,很简单的思想,对于已经排序好的序列ai−aj,0<=i<=ja_i-a_j,0<=i<=jai​−aj​,0<=i<=j,对于元素aj+1a_{j+1}aj+1​,假设需要插入到第kkk个位置,那么从ak,i−1<=

2021-03-17 12:05:08 163

原创 589. N 叉树的前序遍历 栈模拟前序遍历树

589. N 叉树的前序遍历 思路 栈的模拟,在下面的代码中写出了详细的注释。 代码 /* // Definition for a Node. class Node { public: int val; vector<Node*> children; Node() {} Node(int _val) { val = _val; } Node(int _val, vector<Node*> _children) {

2021-03-15 23:04:31 172

原创 1018 Public Bike Management (30 分) dijkstra 回溯

dijkstra+BFS 爆搜所有的路径直接找即可,边的数目为MMM,那么时间复杂度为O(M)O(M)O(M) // 过了四个点 #pragma warning(disable:4996) #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<stack> #include<string&

2021-03-10 21:58:45 182

原创 467. 环绕字符串中唯一的子字符串 固定最后一个字母,求出所有字串的个数

思路 回答一个核心的问题?如何避免重复? 首先我们知道每一个字串,最后一个字符(或者是第一个字符)只有26种可能性,以字母aaa为结尾的长度为lenlenlen的字符串会产生lenlenlen个字串,那么我们用map<char,int>map<char,int>map<char,int>记录以字母charcharchar为结尾的出现的最大字串的长度,长度为map<char,int>map<char,int>map<char,int>的

2021-03-10 20:20:45 128

原创 1314. 矩阵区域和 类似dp的思想减少计算量

思路 自己用的方法不是dpdpdp,套个dp的壳子。 设dp[i][j]dp[i][j]dp[i][j]代表(r,c)(r,c)(r,c)为(i,j)(i,j)(i,j)的时候我们得到的这个小矩形的和。 dp[i][j]=dp[i][j+1]+新增的最左边的那一列的和−失去的最右边那一列的和=dp[i][j+1]+∑a=i−ka=i+kmat[a][j−k]−∑a=i−ka=i+kmat[a][j+k+1]dp[i][j]=dp[i][j+1]+新增的最左边的那一列的和-失去的最右边那一列的和=dp[i]

2021-03-10 16:11:16 718

原创 1022 Digital Library (30 分) 模拟,map和set

思路 其实我们不需要存储每一本书的所有的信息,只需要知道其对应的ididid就可以了,这样的话我们只需要建立title,author,keyword,publisher,yeartitle,author,keyword,publisher,yeartitle,author,keyword,publisher,year到ididid的映射,由于每一个映射的valuevaluevalue值不一定为1,我们可以用vector<>vector<>vector<>来存储,题目要求

2021-03-09 21:43:22 121

原创 1781. 所有子字符串美丽值之和 暴力水题,学一下遍历map的方法

### 解题思路 暴力,学习了一下auto遍历unordered_map<char,int>的用法 原文 const int INF=0x3f3f3f3f; class Solution { public: int beautySum(string s) { int n = s.size(); int res = 0; for(int L=0;L<n;L++){ unordered_ma

2021-03-08 21:48:04 133

原创 面试题 16.26. 计算器 栈,表达式运算

解题思路 表达式运算符优先级算法。 定义运算符的优先级 1\2代表前一个和后一个运算符。例如+++在−-−后面,那么+++属于222指示的那个维度。 假设表达式的开头和结尾有#\## 1\2 + - x / # + > > < < > - > > < < > x > > > > > / > > > > > # < < <

2021-03-08 21:10:01 118

原创 剑指 Offer 14- II. 剪绳子 II 快速幂+数学

思路 数学推导 leetcode官方题解贪心法和数学推导 代码 数学推导法+快速幂 class Solution { public: vector<int>res; int cal(int n){ if(n==0){ return 1; } long long res_=1; long long a=3; while(n){ if(n&1)

2021-03-07 15:52:54 131

原创 1641. 统计字典序元音字符串的数目 几种不同的状态

数学解法 高中学过的隔板方法 dp思路 dp[j][i],j=0,1,2,3,4dp[j][i],j=0,1,2,3,4dp[j][i],j=0,1,2,3,4末尾的字幕为jjj,长度为iii的时候我们取得的最小值字符串的数量。 状态转移方程dp[0][i]=dp[i−1],dp[1][i]=dp[0][i−1]+dp[1][i−1],...,dp[4][i]=dp[0][i−1]+dp[1][i−1]+dp[2][i−1]+dp[3][i−1]dp[0][i]=dp[i-1],dp[1][i]=dp[0

2021-03-05 23:31:33 181

原创 1021 Deepest Root (25 分) dfs,求树的深度

解体思路 寻找到所有的叶子节点,进行dfs,记录深度,最后输出即可。、 又犯了zz错误,自罚三杯。 代码 #include<cstdio> #include<iostream> #include<algorithm> #include<vector> using namespace std; int n; struct Node{ int v; Node(int v_=0):v(v_){} }; vector<vector<N

2021-03-05 22:20:22 110

原创 1020 Tree Traversals (25 分) 后序和中序构建树

思路 后序和中序构造二叉树 唯一一个注意的地方,在注释中。 优快云真垃圾,c++没高亮,还要写成c #include<cstdio> #include<iostream> #include<algorithm> #include<string> #include<cstring> #include<queue> #include<vector> using namespace std; const int MAXN=

2021-03-05 21:34:32 116

原创 837. 新21点 概率型dp

解体思路 这次的dpdpdp从后面往前面,且采用累加的方式。 设dp[i]dp[i]dp[i]代表当前得分为iii的时候,获胜的概率。 那么dp[i]=(dp[i+1]+dp[i+2]+...+dp[i+W])/W,i=0,1,2,...,K−1dp[i]=(dp[i+1]+dp[i+2]+...+dp[i+W])/W,i=0,1,2,...,K-1dp[i]=(dp[i+1]+dp[i+2]+...+dp[i+W])/W,i=0,1,2,...,K−1 这样算的话两层循环(K−1)∗W(K

2021-03-02 19:37:04 247

原创 978. 最长湍流子数组

解体思路 dpdpdp的方法上次都写过了。 这次采用滑动窗口的方法 自己写的代码 // 动态规划方法 // class Solution { // public: // vector<vector<int>>dp; // int maxTurbulenceSize(vector<int>& arr) { // int n=arr.size(); // if(n<1){ // retu

2021-03-02 14:45:11 145

原创 1017 Queueing at Bank (25 分) 模拟,较为简单

思路 模拟题,优先队列维护每一个窗口完成的时间就可以了。 不知道会不会有人的处理时间>60,这个要不要处理,没处理过了。 写的麻烦了,看这个简洁的代码比较好。 简洁的代码 #include<cstdio> #include<iostream> #include<vector> #include<queue> #include<stack> #include<algorithm> using namespace std; int

2021-03-01 20:18:47 104

原创 787. K 站中转内最便宜的航班 图类和边相关的dp

解题思路 状态定义,dp[u][v][k]dp[u][v][k]dp[u][v][k]代表从城市uuu到达城市vvv,最多经过kkk个中转站得到的最小的距离。 本题中,源城市确定,显然这里上面定义状态的第一维uuu就不需要了,所以我们的状态dp[v][k]dp[v][k]dp[v][k]代表从城市srcsrcsrc到达城市vvv,最多经过kkk个中转站得到的最小的距离。 初始状态,dp[src][i]=0,0<=i<kdp[src][i]=0,0<=i<kdp[src][i]=0,

2021-03-01 16:12:44 178

原创 300. 最长递增子序列 动态规划O(n2) 贪心+二分 O(nlogn)

思路 动态规划,定义状态dp[i]dp[i]dp[i]代表以 nums[i]nums[i]nums[i]结尾的最长递增子序列的长度,这样的话dp[i]dp[i]dp[i]和其子问题dp[k],0<=k<idp[k],0<=k<idp[k],0<=k<i便产生了联系、 状态转移方程dp[i]=max(dp[k]+1),0<=k<iif(nums[i]>nums[k])dp[i]=max(dp[k]+1),0<=k<i if(nums[i]&

2021-03-01 11:12:44 220

空空如也

空空如也

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

TA关注的人

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