自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode 1451. Rearrange Words in a Sentence

题目概述解题思路题目要求把字符串按照长度重新排序,我们只需遍历一遍字符串,简历一个map记录每个长度对应的串的先后顺序,然后把字符串重新拼起来即可。方法性能如果map开得够大,可以到O(n)的时间复杂度;否则我们需要对字符串的长度进行排序,复杂度可以达到O(n log(n))。示例代码class Solution(object): def arrangeWords(self, text): """ :type text: str

2021-07-07 09:50:00 195

原创 牛客网. 未排序数组中累加和为给定值的最长子数组系列问题补2

题目概述解题思路方法性能示例代码

2021-06-09 10:37:06 143

原创 牛客题霸. 未排序数组中累加和为给定值的最长子数组长度

题目概述解题思路方法性能示例代码

2021-06-03 09:19:28 173

原创 牛客网. 未排序正数数组中累加和为给定值的最长子数组的长度

题目概述解题思路方法性能示例代码

2021-06-02 09:44:13 143

原创 牛客网 找到搜索二叉树中两个错误的节点

题目概述解题思路方法性能示例代码

2021-06-01 18:24:10 498 2

原创 leetcode 968. Binary Tree Cameras

题目概述解题思路我看到这道题的时候,第一思路是贪心。我想着如果要用最少的相机覆盖树的节点,那么:每个叶子节点的父节点都需要放一个相机,这是因为如果把相机放在叶子节点,它覆盖的节点数会更少;同时我们又要覆盖每个叶子节点,所以把相机放在每个叶节点的父节点位置。 我们去掉所有已经被覆盖过的节点,对于余下的树,继续采用这个策略,最后检查根节点是否被覆盖,若没被覆盖则放一个相机。接下来我们思考,如何能根据这个思路,递归地实现树节点的遍历与相机的摆放。也就是说,我们该怎么用一个函数递归地访问节点,然

2021-05-26 11:14:37 92

原创 leetcode 45. Jump Game II

题目概述解题思路这道题的题意是,告诉我们有条石子路,和从每个石子跳跃的最大距离,问我们抵达终点的最少要跳几次。我一开始采用动态规划的方法,开个一维数组记录到每个石子需要的最少跳跃次数。然后参考了大佬的博客,发现其实空间复杂度可以优化到O(1):采用贪心的做法,先记录上一次跳跃的最远范围preLen,当前能跳到的最远距离为curLen(初始化时,上一次跳跃的距离为0,这一次的为nums[0]),然后计算下一次跳跃最远能到的距离是多少:其实就是从preLen + 1开始遍历到cu

2021-05-26 00:14:59 129

原创 leetcode 1871. Jump Game VII

题目概述解题思路这道题的题意是说,告诉我们一条石子路上有哪些位置的石子可以落脚,以及每一次能跳的距离的范围,问我们能不能跳到终点。我的想法一开始是直接用动态规划,开一个一维数组记录每个石子能否落脚,然后对每个石子都算一下从它出发所能访问的石子有哪些,更新这些石子的状态即可。假设路程长度为N,跳跃范围为K,则时间复杂度为O(N*K)。这显然是不可接受的_(:з」∠)_然后我就在想,能否只访问一遍每个元素(O(N)时间复杂度),就得到结果呢?实际上是可行的。我们在起始的位置相当于可以获悉

2021-05-25 21:56:33 234

原创 leetcode 1855. Maximum Distance Between a Pair of Values

题目概述解题思路维护两个指针i,j,分别用于遍历两个数组A和B。根据题意,当A[i] > B[j]时,i ++,若i同时与j相等,则j ++;否则j++。方法性能O(max(M, N))时间复杂度:示例代码class Solution {public: int maxDistance(vector<int>& nums1, vector<int>& nums2) { int len_A = n

2021-05-22 21:44:14 103

原创 leetcode 1856. Maximum Subarray Min-Product

题目概述解题思路这道题我乍一看并没有什么头绪,只能想着暴力求解,复杂度是O()。看了别人的思路,发现这道题是包装巧妙的前缀和数组+单调栈的问题。我们只需要对于每个数,找到以它为最小值的最长的子数组,然后计算这个数对应的min-product,再比较所有元素的min-product即可。找最长子数组可以用单调栈来完成,而计算这个子数组的元素的和,可以用前缀和数组来实现。这里回顾一下单调栈是如何求出最长子数组的左右边界的:首先我们维护一个从栈顶到栈底元素单调不递减的数组,从左到右遍历

2021-05-22 16:54:52 354

原创 leetcode 1860. Incremental Memory Leak

题目概述解题思路思路就是不断比较memory1和memory2谁更小,然后实时更新这两个的值即可。方法性能示例代码class Solution {public: vector<int> memLeak(int memory1, int memory2) { int L_idx, timer = 1; while(1) { if(memory1 >= memory2).

2021-05-21 18:24:24 111

原创 leetcode 1861. Rotating the Box

题目概述解题思路题意是:给定一个盒子(用二维矩阵表示),盒子里面每个格子有三种情况:空/有可以移动的石头/有不能移动的障碍。现在把水平放置的盒子竖直摆过来,问盒子里面会发生怎样的变化。这道题的做法是:单独分析每一行的变化。对于每一行来说,我们从右往左分析逐个格子(表示当前指针所指位置),维护一个变量,记录当前行最靠右边的障碍的位置:如果格子里是障碍,则更新; 如果格子里是石头,则将石头移动到的位置。方法性能时间复杂度是O(MN):示例代码...

2021-05-21 14:31:07 160

原创 leetcode 1864. Minimum Number of Swaps to Make the Binary String Alternating

题目概述解题思路方法性能示例代码class Solution {public: int minSwaps(string s) { int len = s.size(); int N0 = 0, N1 = 0; for(int i = 0; i < len; ++i) { if(s[i] == '0') N0++; .

2021-05-21 11:26:10 153 2

原创 leetcode 102. Binary Tree Level Order Traversal

题目概述解题思路层次遍历二叉树,我们采用广度优先搜索,然后开两个计数器,分别记录当前层次的节点遍历的数目,以及下一层节点的数目即可。非递归的遍历使用queue实现。方法性能示例代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(.

2021-05-20 16:57:27 91

原创 leetcode 462. Minimum Moves to Equal Array Elements II

题目概述解题思路我一开始的思路是先求数组均值,然后和每个元素相比得到步长。但是我发现这个方法存在隐患,如果每个元素的值都取到,并且总共有个元素,那么在计算均值的时候,我们如果先对所有元素求和,这个和就会达到,超出了int型表示的范围,需要用long long类型。接下来我看了别人的思路:有个老哥说,其实我们应该先观察一下这个数组的取到的中间值的规律。观察发现,当数组元素有奇数个时,中间值就是它的中位数;当数组元素有偶数个时,中间值就是两个“中位数”及其间任意一个值。因此,我们只需要找到数

2021-05-20 09:46:48 81

原创 leetcode 1048. Longest String Chain

题目概述解题思路我刚看到这题的时候,想到的思路就是把每个字符串当成一个节点,判断两个点之间是否存在联线,然后构建出一个有向图(森林);然后对所有入度为零的节点去求最长的路径。这个方法实现起来就比较复杂,所以我参考了他人解法:有个老哥用了动态规划来求解这道题。他用一个一维的数组dp存储以各个元素为链尾时,链的最长长度。我们首先按照字符串的长度,对原始的字符串vector重新排序。然后对第个字符串,我们只需要遍历一下在它之前的字符串(长度不超过它),对那些长度比它少一的串,做一下比较,看下当

2021-05-19 16:37:08 105

原创 leetcode 1310. XOR Queries of a Subarray

题目概述解题思路异或问题的常用解题技巧是:a元素和它自身的异或的结果是0. 依据这个技巧,我们可以看出,这道题要求我们多次异或从到之间的元素,就相当于先算出从起始位置0到的异或值,再算出从0到的结果,然后将两者异或即可。这样,我们可以先用线性时间复杂度的方法求解出从0到数组中任意位置的连续子数组的异或结果,然后根据query的需要计算中间结果。根据动态规划的思想,我们可以维护一个长为的数组,存储从0位置起始的连续个元素的异或值,记做。每个query的值等于:方法性能整个方法是线性时.

2021-05-19 09:29:03 88 2

原创 leetcode 238. Product of Array Except Self

题目概述解题思路这道题如果允许使用除法,那难度显然只有easy。。。既然这道题要求不能用除法,而且时间复杂度在O(n),我们必然需要存储临时的结果用于提速度。不妨考虑一下,数组中的第 i 个乘积实际上是由它前面的 i - 1个的乘积,和后面的 len - i 个元素的乘积相乘得到的。我们可以先存储这两个数组,然后相乘,即可得结果。我们还可以继续优化空间复杂度。思路就是,用最后返回的结果存储这个临时数组。方法性能O(N)时间复杂度, O(1)空间复杂度。示例代码class

2021-05-18 16:36:44 85

原创 poj 2031. Building a Space Station

题目概述解题思路根据题意,这道题是要求给定的N个三维球体的最小生成树。这道题的数据特点在于:点不是特别多(100以内) 但是每两个点之间都需要计算一下距离(E~V^2)这就是说,我们采用邻接矩阵存储图是更好的策略。另外,考虑到边的数目非常多,我们采用类似于Prim算法的思想来求解,即维护最小生成树的子树,每次添加未使用的节点到该子树的最小的边。方法性能方法的时间复杂度为O():示例代码...

2021-05-18 15:49:01 100

原创 leetcode 103. Binary Tree Zigzag Level Order Traversal

题目概述解题思路方法性能示例代码

2021-05-17 20:12:50 83

原创 牛客网. 从上往下打印二叉树

题目概述解题思路采用广度优先搜索即可。方法性能复杂度为O(N),假设树有N个节点。示例代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: vector<int> Pri

2021-05-17 19:20:17 60

原创 牛客网. 之字形打印矩阵

题目概述解题思路设置一个变量记录每一行打印次序就可以了。方法性能示例代码class Printer {public: vector<int> printMatrix(vector<vector<int> > mat, int n, int m) { // write code here vector<int> res; for(int ni = 0; ni &lt

2021-05-17 19:01:04 98

原创 leetcode 207. Course Schedule

题目概述解题思路分析这道题的意思,看上去是要我们判断一个有向图中是否存在环。判断图中是否存在环,可以采用拓扑排序方法。它的思路是:首先,判断图中是否存在入度为零的节点; 然后,将所有入度为零的节点(记为)删除,并将从该节点出发的所有节点的入度减去1; 重复以上两步,直到图中不存在入度为零的节点。 这时,检查是否还有节点未被删除(也就是,是否存在入度不为零的节点),如果存在,则不符合拓扑排序的条件。在实现上,我们可以用BFS/DFS遍历图,维护每个节点的邻接节点,同时记录每个节点的入度

2021-05-17 14:36:15 104

原创 hdu 3790. 最短路径问题

题目概述解题思路这道题显然是采用单源最短路径去求解,我采用的是Dijkstra算法。这道题相当于除了要维护各个节点到起点的最短路径长度,还要维护到起点的代价。我首先采用的构图方法是:设置一个二维数组,第一维是节点数目,第二维是每个节点的邻接节点数目——class Edges{ public: int val, dist, cost; Edges(int vi, int di, int ci): val(v

2021-05-17 10:38:13 132

翻译 代码的马斯洛金字塔理论

马斯洛曾提出了著名的需求层次理论(马斯洛需求金字塔理论):人们需要动力实现某些需要,其中的一些需求优先于其他需求。我们可以把人类的需求划分为五个层次(如图1所示),从层次结构的底部往上,需求分别为:生理(食物、衣服),安全(工作保障),社交需要(友谊),尊重和自我实现。前四个级别通常称为缺陷需求,而最高级别称为增长需求。图1. 马斯洛需求金字塔资深工程师Charles-Axel Dein 总结了代码评审 (code reivew) 时存在着类似的层次理论。他把代码的质量同样分为五个层级:.

2021-05-16 10:15:39 1192

原创 leetcode 79. Word Search

题目概述解题思路我采用的思路是深度优先搜索。复杂度是O(MN * len(S))。方法性能蜗牛速度:接下来开始优化,我的优化思路主要有:去除设置的二维矩阵,用原始矩阵“存储”当前遍历的状态。思路就是把当前遍历到的那个位置的值,置为某个不属于矩阵出现的字符范畴的值(比如“#”),等到遍历完从该节点出发的所有矩阵以后,再将它置为原值; 减少计算矩阵的形状、字符串长度所花的时间,我们把这些值作为参数直接传入函数 减少递归函数部分的复杂度。看下加速结果:示例代码蜗牛

2021-05-15 16:09:54 113

原创 leetcode 133. Clone Graph

题目概述解题思路这道题的主要难点在于两个:建图 遍历这道题依然采用了邻接链表的方式建图,之前我建图采用的方式是:开一个两个维度的数组,第一个维度表示节点的数目,第二个维度表示和每个节点相连的边:class Edges{public: int weight; string val; Edges(int wi, string vi): weight(wi), val(vi){}};map<string, int> str2idx;vec.

2021-05-14 10:42:19 73

原创 leetcode 417. Pacific Atlantic Water Flow

题目概述解题思路我的思路是:先对邻边是太平洋或者是大西洋的节点分别做一次广度优先搜索,找出所有的从边界节点出发且满足不降序的路径;然后把大西洋的节点集和太平洋的节点集求交集,这个结果就是我们想要的结果。方法性能这个方法的时间复杂度是O(M*N)。示例代码...

2021-05-13 20:05:46 76 2

原创 leetcode 1734. Decode XORed Permutation

题目概述解题思路我首先打印了一下N=3和N=5的时候的各种情况的encoded的值,试图找到思路,可惜未果。然后我开始分析,我发现,由于异或运算有这样一个性质:(a ^ b) ^ (b ^ c) = a ^ 0 ^ c = a ^ c我们就可以得到第一个元素和后面n - 1个元素的异或的结果:a[0] ^ a[1], a[0] ^ a[2], ......, a[0] ^ a[n - 1]接下来,我们要做的就是求出a[0]。该怎么计算呢?还是利用上面的性质,如果我们把a[

2021-05-13 17:01:53 95 2

原创 210513袋鼠面试:打印有向无环图中从某节点出发的所有路径

题目概述给定一个有向无环图G,如下图所示,然后给出图中的某个节点,要求打印出从该节点出发的所有路径。输入:第一行输入两个整数E, N和一个字符tgt,E和N分别表示边的数目和节点的数目,tgt表示起始的节点值。接下来输入E行,每行两个字符sta和end,分别表示第条边的起点和终点。样例:样例1input:6 5 AA BA CB CB DC ED Eoutput:ABCEABDEACE样例2input:12 8 AA BA CA DB

2021-05-13 11:09:31 442

原创 leetcode 1293. Shortest Path in a Grid with Obstacles Elimination(网格中的最短路径)

题目概述解题思路方法性能示例代码

2021-05-11 11:07:24 127

原创 北大百练. 4143:和为给定数

题目概述解题思路我采用思路比较暴力:首先对数组做排序;然后维护两个指针L和R,一头一尾遍历数组A:如果A[L] + A[R] == tgt,打印这两个值;如果 < tgt,则说明A[L]太小,L++;否则, R--。再给出一种O(n)复杂度的做法:维护一个map,记录每个值出现的次数。然后遍历数组,查找每个元素A[i]的对应元素tgt - A[i]是否在map中出现(特别注意2 * A[i] == tgt)的情况。方法性能第一种方法:时间复杂度为O(

2021-05-10 00:19:18 379

原创 210509袋鼠笔试之二:Barrier

题目概述时间限制:3S内存限制:1048576KB题目描述:小M和小T搬家,他们要把家具从围栏上搬过去。围栏由n个独立木桩排成一条直线组成,第 i 个木桩编号为 i 。由于体力有限,只能越过高度不超过 h 的围栏。同时,家具又有宽度限制,只有连续m个木桩都能搬过去才能成功将家具搬过去。现在他们想知道能否成功搬家。输入描述:第一行三个整数n, m, h。第二行n个整数,height 1, ..., height n,依次表示每个木桩的高度。1<=m <= n <=

2021-05-09 13:38:22 96

原创 leetcode 130. Surrounded Regions

题目概述解题思路题目要求把除了所有与位于边界的'O'邻接的'O'之外的'O'都变成'X'。所以我们要做这样几步:首先,遍历四个边界,找到位于边界的'O'; 然后,对于所有在边界的'O',以他们为起点进行深度优先搜索/广度优先搜索,找出所有与他们邻接的'O'; 对余下的'O'做变换。方法性能示例代码class Solution {public: void solve(vector<vector<char>>& board) {

2021-05-08 19:56:04 88

原创 牛客网. 整数中1出现的次数(从1到n整数中1出现的次数)

题目概述解题思路我们通过分析样例,来推敲一下这道题的算法流程。假设输入的数n=51302。我们依次统计输入的数的各个数位可能出现1的数目,需要记录的值还有各个数位的阶数,以及n对它们取模或者除以它们以后的值mod和val。val mod multi num 5130 2 1 5130*1 + 1 513 2 10 513*10 + 0 51 302 100 51*100 + 100 5 1302

2021-05-08 15:34:51 95

原创 牛客网. 求最长可整合子数组的长度

题目概述解题思路首先理解一下这道题的意思:要求找到原数组A中的最长的连续的子树组,满足子树组经过排序以后,得到的是连续的一个自然数序列。如果采用暴力的求解方法,就是对每个子树组都进行一次遍历,显然时间复杂度在O()以上,我们不予考虑。题目要求说,时间复杂度可以控制在O(),我们不妨思考一下,这个最长的子树组的特点:子树组中的元素两两不相等 子树组中的元素是连续的 包含的元素数量尽可能多如果我们维护子树组的最值,,同时统计一下它的不重复的元素个数,就可以把上述的条件转换成

2021-05-08 10:37:54 114

原创 leetcode 581. SHortest Unsorted Continuous Subarray

题目概述解题思路这道题首先提示我们:有O(n)时间复杂度的解法。也就是说,只需要常数次地遍历数组即可。观察这个数组,我们可以发现,关键在于找到第一个和最后一个需要调换位置的数的序号。这该怎么找呢?观察发现:假设数组A前i个元素的最大值为,如果A[i+1] <,则该元素必定要调换顺序;如果A[i+1] ==,则要根据之后的结果判断。同样假设数组A后j个元素的最小值为,如果A[j-1] >,则该元素必定要调换顺序;如果A[j-1] ==,则要根据之前的结果判断。这样我们先...

2021-05-07 23:10:24 63

原创 北大百练 4075. 矩阵旋转

题目概述解题思路思路比较简单,只需要修改一下打印数组的顺序即可。原先是从左往右、从上往下读取数组,现在打印数组的顺序变成从下往上、从左往右。方法性能示例代码#include<iostream>using namespace std;int main(){ int M; int A[100][100]; scanf("%d", &M); int N; for (int i = 0; i < M; ++i) { scanf("%d

2021-05-07 22:28:58 90

原创 牛客网. 找到二叉树中的最大搜索二叉子树

题目概述解题思路这道题的思路并不复杂:我们需要先判断每个节点作为根节点时,对应的子树是否是二叉搜索树;对于那些是BST的子树,计算这个节点拥有的节点个数。这道题的一个关键在于:千万不要忘记,二叉树中的节点不一定非要有两个节点,我之前把这个定义弄错了,所以debug了很久_(:з」∠)_这道题的另一个关键是:要让树先去遍历左右节点,而不是先判断条件,这有可能导致递归遍历过早地结束,没有取得最大值。方法性能示例代码...

2021-05-07 22:09:41 181

原创 hdu 1710. Binary Tree Traversals

题目概述解题思路题意是已知二叉树的前序、中序顺序,要求后序。二叉树的前序遍历特点是,根节点永远出现在叶子节点之前,而中序顺序的特点是,根节点在左子树和右子树之间。我们先从前序遍历中找到根节点,就可以判断它的左右子树的构成;然后以此类推,就能重建出整棵树。接下来根据“左右中”的顺序打印二叉树的节点即可。这道题的坑在于,它的输入并不是只有一组,而是多组;所以需要用while来读取。解法性能示例代码我这里分别用数组和vector实现。...

2021-05-07 08:03:37 130

空空如也

空空如也

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

TA关注的人

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