- 博客(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
758
原创 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
173
原创 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
139
原创 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
144
原创 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
104
原创 面试题 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
91
原创 剑指 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
110
原创 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
116
原创 241. 为运算表达式设计优先级
思路$vector diffWaysToCompute(string expression) $代表表达式可以计算出的所有的值。那么进行递归运算即可。其实所有的答案就是卡特兰序列进出栈产生的所有的出栈序列的值。看了一下没写,原代码[在这](Python/Golang 分治算法 - 为运算表达式设计优先级 - 力扣(LeetCode) (leetcode-cn.com))代码class Solution {public: vector<int> diffWaysToCom
2021-04-20 00:09:37
76
原创 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
66
原创 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
165
原创 424. 替换后的最长重复字符 滑动窗口,好题
解题思路原本的解题思路,枚举最长字符串的第一个字符,然后不断向后寻找最长的字符串,思路错误,因为s里面的字符不一定是最长字符串的第一个字符。正确的思路:滑动窗口设置一个left指针,一个right指针:left=right=0;设置一个res=0,记录我们的结果。设置maxCharNum维护窗口中也就是[left,right)区间内的出现最多的字符的个数,这样剩下的字符个数就是remain=right-left-maxCharNum,当remain<k的时候,所有的字符可以被替换,
2021-04-13 15:14:16
84
原创 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
132
原创 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
85
原创 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
79
原创 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
74
原创 面试题 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
71
原创 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
79
原创 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
119
原创 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
74
原创 第九章-内部排序
Chapter 09 Internal sortingDefinitionStable and UnstableInsertion based sortingStraight 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
84
原创 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
102
原创 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
119
原创 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
64
原创 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
373
原创 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
66
原创 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
74
原创 面试题 16.26. 计算器 栈,表达式运算
解题思路表达式运算符优先级算法。定义运算符的优先级1\2代表前一个和后一个运算符。例如+++在−-−后面,那么+++属于222指示的那个维度。假设表达式的开头和结尾有#\##1\2+-x/#+>><<>->><<>x>>>>>/>>>>>#<<<
2021-03-08 21:10:01
69
原创 剑指 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
71
原创 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
62
原创 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
58
原创 1020 Tree Traversals (25 分) 后序和中序构建树
思路后序和中序构造二叉树唯一一个注意的地方,在注释中。CSDN真垃圾,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
59
原创 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
135
原创 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
87
原创 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
57
原创 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
119
原创 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
154
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人