
Leetcode高级算法
文章平均质量分 60
C+G
也就那样
展开
-
有关期末复习的贪心题目——课程表III
文章目录题目解题思路解题代码题目解题思路这道题可谓是深有感触,最近期末考试正好正在进行中,我的复习(预习)也正在进行中,我是一个经常逃课的孩子(…)大家在期末复习的时候怎么进行先后复习的呢?我们肯定是先复习距离考试时间最近的科目啊。而这道题给的就是每次只能处理一个科目的复习,中间不间断,然后给了你每个科目的复习时间。这就导致如果有些科目虽然是距离DDL时间近,但如果我们复习完它之后就会导致其他的DDL远一些的无法完成复习,具体举例子如下:假设 duration 数组是这样的 大学物理 [2,原创 2021-12-14 23:49:21 · 615 阅读 · 2 评论 -
扫描线——391. 完美矩形
文章目录题目题目解析代码详解题目OJ平台题目解析扫描步骤:把点扫描转为线扫描。把每个矩形用左右两边进行表示,如何表示边?(a,b,c) a代表这条边的x座标,而b,c代表对应的y座标。把一竖行的所有线合并。但注意可能被隔开,但没关系,后续判断即可。根据如图所示的规律进行求解。最左边的和最右边的一竖肯定只能是一竖线,而中间的每一竖线都有左右两竖线!代码详解java代码解析class Solution { public boolean isRectangleCover(in原创 2021-11-17 14:55:58 · 321 阅读 · 0 评论 -
等差数列划分--子序列问题DP解决
文章目录题目暴力回溯构建等差数组+数学方法优化以等差数列的最后两元素为状态dp题目视频讲解暴力回溯构建等差数组+数学方法优化当出现完全一样元素大小的长度很长的数组数组时,可计算Cn1…Cnn来实现。超时,差最后一个caseclass Solution {public: int numberOfArithmeticSlices(vector<int>& nums) { using ll = long long; int n原创 2021-08-11 17:33:46 · 285 阅读 · 0 评论 -
「ICPC World Finals 2017」色调分离 Posterize --区间dp关系递推
文章目录题目题目分析解题代码题目oj平台题目分析该题是需要我们按要求把给出的颜色种类用 k 种颜色进行替换,输出这种情况的最小误差值。那么我们很快能想清楚一般情况:当 k==d 那么显然不需要更改原像素类型,误差是为 0 的。当 k==1 时,我们可以直接枚举计算出最小误差。再次经过仔细斟酌,你会发现如果假设给出的颜色种类值的大小是有序排列的,那么为了使得误差最小,被替换为同一种颜色值的原像素的色调值肯定也是挨在一起的,例如原像素值为 1 25 46,需要替换为 k = 2 种像原创 2021-07-19 20:39:56 · 642 阅读 · 1 评论 -
绝对和差值:二分与贪心思想的联合考察
文章目录题目题目解析解题代码题目oj平台题目解析最开始读完题,我还得意洋洋的以为,只需要找到,不改变情况下,绝对值差值最大的那个,然后对他进行差值最小的优化。。。还是太年轻了,这样的贪心完全不对,我们将每一个绝对值差值和他的最优情况的差值进行比较,得出这两个差值的最大值,而不是单纯只考虑到原绝对值差值大。。。错误代码示范class Solution {public:const int MOD = 1e9+7; int minAbsoluteSumDiff(vector&l原创 2021-07-14 20:25:51 · 144 阅读 · 1 评论 -
华为、字节二面原题--三等分
文章目录题目题目解析根据思路设计程序题目oj平台题目解析该题没什么特殊技巧,就是要有分离问题的逻辑思维能力,由于要划分三等分的二进制码,只需要保证数字大小相同就行了,那么很快可以得到两个关键信息:三等分中1的个数肯定是相同的。三等分中前导0对他们的大小无任何影响,但后导0会有影响。三等分究极详解手写图:根据以上关键信息我们可以得出符合以下四种情况才有三等分:通过从左到右计数确定每个1区间的开始与结束(让每个区间内都有相同数量的1)。然后判断每个1区间的长度(保证每个原创 2021-07-13 12:50:37 · 291 阅读 · 2 评论 -
四数之和的解决方法--双指针+去重+剪枝
文章目录题目题目解析代码以及效率题目题目解析读完题目,发现需要去重!那么这就需要在排序的基础上,判断每次的选择和上一次是否相同,若相同则continue,由于是选择同一个数组元素的组合,所以无法使用哈希表进行优化,只能通过双指针,把两层循环优化为一层循环。优化的关键:剪枝最小的四个加起来若还是大于 target 则不可能存在等于 target 的组合 => break;当前选择的数加上最大的三个数小于 target 则当前选择的数无法形成等于 target 的四元组。=>原创 2021-07-10 20:46:55 · 270 阅读 · 1 评论 -
(实战类编程题)点菜展示表实现--利用哈希表作值
文章目录题目题目解析逐步解析代码建立哈希表映射数组记录数据并排序更新table(copy函数的使用)整合答案做题收获题目题目解析读完题目,我们需要确定的有三点:菜品名目。2. 顾客所在餐桌号。3. 该餐桌号该类菜品需要的数目。题目中还要求,菜品名目需要按照字典序排序,所在餐桌号也需要如此。根据以上解读我们可以给出以下方法进行逐一解决:建立哈希表用于记录映射关系:创建以哈希表为 value 的哈希表,通过餐桌号来索引到另一个哈希表,另一哈希表用于记录这一桌所点的菜的种类对应的原创 2021-07-06 23:34:23 · 199 阅读 · 0 评论 -
双栈完全解决计算器问题
文章目录题目题目分析代码拆解预处理关键求值函数calc()括号处理数字和字符处理综合代码得出答案题目我就口头描述一遍吧:把给出的表达式字符串计算它的算式结果并返回。其中表达式只含有:’+’、’-’、’*’、’/’、空格、数字。。。这些字符。而对于表达式可能会出现:3+(2*-2) or 7+(-34+5)..等特殊情况。题目分析对于这种算式计算我们一般采用双栈形式:数字处理栈:用于存储表达式中的数字。字符处理栈:用于存储各种运算符以及括号。而我们如何处理这样一个计算过程呢?原创 2021-07-06 18:59:12 · 394 阅读 · 0 评论 -
动态规划过程详解--传递信息求组合题目
文章目录题目普通bfs或dfs暴力解法dp过程详解题目oj平台普通bfs或dfs暴力解法此题在LeetCode上的难度显示是简单题,原因不言而喻,因为可以通过暴力解法通过。。。当然这种暴力解法一般只适用于问题规模30以下。。如果比赛中碰到大概率是1000以上复杂度。。。所以还是老老实实dp吧!此题只要通过map把关系图建好,则就能通过暴力解法搜索解题代码:class Solution {public: int numWays(int n, vector<vector&原创 2021-07-01 13:27:42 · 231 阅读 · 1 评论 -
另类bfs建图--求到目标地坐公交的最小换乘次数
文章目录题目题目解析做题细分步骤题目题目解析建立如图:不同颜色的连接代表不同公交车由于是权值为1的图(所以一般想到用bfs求最短路径),虽然单看各个站点构成的图十分复杂。但由于这个不是直接记录两个站点间的最短距离,而是记录到达终点最少的车辆换乘次数,所以我们以乘坐一辆公交车作为bfs的一步选择,每次通过遍历站点对应的各个公交车将所有点走遍,这就相当于一次选择。为防止形成环的死循环,我们应该用 visit 标记每次访问过的站点(实际上肯定要用它标记乘坐过的公交车),防止无限循环。如果通过 vi原创 2021-06-28 23:37:31 · 694 阅读 · 1 评论 -
摇骰子走步数--压缩为一维空间的bfs最短路径
文章目录题目题目解析解题代码题目一个N * N的棋盘,起点是左下角,一次可以走 1-6步从左下角开始棋盘编号从下往上蛇形递增7 8 96 5 41 2 3如上图(其实不是图)所示:起点是 1,终点是 9(N*N) (1-9为棋盘编号)每格棋盘单元格内容一般是-1如果棋盘单元格内容不是-1,而是一个数字,则如果跳到这里,就要传送到指定数字编号的棋盘单元格中-1 -1 -1-1 -1 -1-1 -1 8如图:走到第三个格的位置,就会自动被传送到8的位置问:到终点的最少次数原创 2021-06-27 20:01:31 · 409 阅读 · 1 评论 -
哈希表与直线点的记录--直线上最多的点数计算
文章目录题目题目解析第一种解法第二种解法题目oj平台题目解析此题有两种思路解决,但是无一例外都是需要用到哈希表。第一种解法:通过记录直线的斜率和截距。具体步骤:写出用于计算任意两点之间斜率和截距的函数,返回值为二元组。枚举任意两点的斜率和截距,当两者均相同时视为同一直线上的点,以斜率和截距为 key ,点的编号为 value ,通过哈希表记录下来,如果满足 key 相同则需要判断点是否已经出现过,若出现则不需记录该点(正好可用 set ).更新答案为 key 对应的点最多的个原创 2021-06-24 18:33:39 · 186 阅读 · 1 评论 -
(采油区域)二维前缀和+动态规划关系+分类讨论
文章目录题目逐步解析第一步:二维前缀和处理第二步:根据二维前缀和得出表示某k区间和表示第三步:以第二步为基础得出任意一点的左\右上角、左\右下角、任意两列\两行的最大k区域和值最后一步:枚举得到答案代码汇总得出答案题目oj平台逐步解析第一步:二维前缀和处理什么是前缀和?比如对于一个一维数组 nums,他的前 i 个数的总和就是下标i的前缀和,即 sum[i] 表示前i个 nums 数组元素之和。一维数组前缀和有以下关系:sum[i]=sum[i−1]+nums[i−1]sum[i] = su原创 2021-06-22 07:31:41 · 438 阅读 · 1 评论 -
字符的判重--位运算
文章目录典型例题:最长无重复字符的串联字符串题目解析两种形式的dfs解决dfs回溯形式dfs二进制枚举形式典型例题:最长无重复字符的串联字符串题目解析此题看完之后,字符相关且不能含重复字符,便能想到用位运算判重,而其中要求的是数组子序列串相连,这就很明显牵扯到组合问题,组合问题,我们可用多种方式枚举组合,可用二进制枚举组合,也可用dfs枚举,而dfs枚举也有两种形式:偏二进制的形式||回溯形式。这题由于最后要求返回一个最长的 无重复字符的字符串,则该字符串长度肯定不会超过26(毕竟也就26原创 2021-06-20 01:13:27 · 200 阅读 · 0 评论 -
计算图的最短距离--Dijkstra算法
文章目录(也就5min)先点开链接把Dijkstra算法过程看一看(否则肯定看不懂代码).详解代码实现过程(请结合视频过程分析)用到的基本数据表示各个函数模块实现(重在Dijkstra函数)以题代讲--具体实现蓝桥杯--文化之旅解题过程汇总代码提交(也就5min)先点开链接把Dijkstra算法过程看一看(否则肯定看不懂代码).视频详解Dijkstra算法过程详解代码实现过程(请结合视频过程分析)用到的基本数据表示根据视频中讲解的实现原理,我们需要通过三个数组来实现该过程。dist[i]数原创 2021-06-19 21:02:19 · 549 阅读 · 0 评论 -
学以致用--确定有穷状态自动机(DFA)
文章目录题目题目解析最后的解题代码题目题目解析看完题目,很明显的给出字符串,要求判断该字符串是否可接受,这就很明显了,形式语言与自动机恰好有这样的题目,给出可输入变量的集合,然后构造一个可接受某种语言的自动机,对于这道题的要求就相当于对可接受语言的描述,而给出的字符串就是随机给出的语言,我们只需要构造好对应语言的DFA就可以通过DFA确定该语言是否可接受。好了理论的课本知识分析到此为止,具体的代码如何敲呢?我们可以先画出自动机的状态转移图,根据状态转移图得出对应的状态转移表,故可以通过数组来原创 2021-06-18 13:09:49 · 1191 阅读 · 0 评论 -
二分进阶--在二分外面套一枚举
文章目录题目题目解析解题代码题目题目解析读完题目,我们可以很清楚的知道最后以好进制表示的n的结果,结果肯定是多数个1组成,即11111…(m进制) = n(10进制)。总结步骤:枚举1的长度。通过二分法搜索对应的进制数。通过mid对应的进制数得到1序列的十进制数。通过十进制数与n对比缩小二分搜索区间知道找出对应的进制。对于强类型语言按照上述方式进行计算肯定会溢出。。为了防止溢出需要对枚举的范围进行限制,由数学推导课得出,1的序列长度不会超过log2(n),进制数也不会超过k原创 2021-06-18 11:38:34 · 141 阅读 · 0 评论 -
取分数博弈--动态规划
文章目录题目题目解析反着遍历斜着遍历题目题目解析用dp[i][j]表示在数组nums[i]~nums[j]中当前先手玩家与另一玩家拿下分数的最大差值。所以存在以下dp关系:dp[i][j] = max(nums[i]-dp[i+1][j],nums[j]-dp[i][j-1]),表示取首和尾,由于dp的定义所以展开为dp[i][j] = 当前先手玩家得分-当前后手玩家得分,所以对于dp[i+1][j]或者dp[i][j-1]他们的先手就是dp[i][j]的后手,所以要得到先手-后手则需要取'-'原创 2021-06-16 15:25:02 · 139 阅读 · 0 评论 -
如何快速写好bfs?
文章目录如何快速写好bfs?例题练手题目双向bfs主逻辑双向bfs扩散逻辑整段代码提交后的效率如何快速写好bfs?为什么说是如何快速写好呢?我认为于大多数人而言,懂得了基本的bfs模板,那么写好这个大概的框架肯定是不在话下,但就是有那么一段逻辑可能会格格不入。那段逻辑就是扩散时候的各种操作逻辑。如何解决?弄清扩散的目的是什么?扩散的目的是为了找到终点,如果该轮扩散都未找到终点,那么扩散就为你提供了后续的起点,也就是说扩散的最终目的还是为了找到终点。中间未找到终点的操作无非就是入队形成下原创 2021-06-15 19:42:54 · 318 阅读 · 0 评论 -
子数组问题--乘积最大
文章目录题目解题思路解题代码题目解题思路利用两个变量min和max进行操作,以负数为分界点,轮流更新有效值。为防止破坏子数组的乘积这一条件限制,我们更新时需要利用max(nums[i],max*nums[i])而不是max(max,max*nums[i]).解题代码效率还挺好class Solution {public://因为只要是正整数,一直累乘肯定是增大的,关键就在于需要连续的正数,如果中间一旦出现负数或者是0, int maxProduct(vector&l原创 2021-06-14 23:59:30 · 224 阅读 · 1 评论 -
为链表排序量身定做的算法--归并排序
文章目录为什么说为链表排序量身定做?如何实现?具体代码:为什么说为链表排序量身定做?很简单,如果归并排序用在数组中,是需要额外的数组作为辅助,而如果是链表,这个操作就很简单了,每次去结点直接拿下来即可,没必要畏畏缩缩,所以空间上不存在额外的使用。看看效率:如何实现?归并排序三步走:自顶向下分割链表,直到单个有序。(merge函数实现)合并两个有序链表(mergeTwoLists函数实现)根据递归特性LIFO,将分割后的单个有序结点利用mergeTwoLists排序,自底向上返回得到最终原创 2021-06-14 17:27:47 · 93 阅读 · 0 评论 -
链表的三种插入排序+冒泡排序
不改变结点位置的插入排序结合数组的实现方式,唯一的不同在于从前往后遍历,但是这种插入排序对链表来说还是太慢了。class Solution {public: ListNode* insertionSortList(ListNode* head) { if(!head||!head->next) return head; ListNode* cur = head->next; ListNode* pre =原创 2021-06-13 20:29:39 · 325 阅读 · 0 评论 -
背包问题再进化--通过装载路径得答案
文章目录题目题目解析解题代码题目题目解析看完题目,可能会懵逼,实际就是选择成本和为target的最大数字。那么为了让它为最大数字,首先要满足的肯定是位数要够多。所以通过背包模板可以求出成本和为target的最大位数(在背包看来就是物品装入的最大次数)所以根据以上分析做题可以分为两个步骤:找出和为target的最多取数次数(对应最大位数),所以通过背包模板可以求出成本和为target的最大位数(在背包看来就是物品装入的最大次数)。遍历已经得出结果的dp数组,根据它的路径来判断该位数字是否原创 2021-06-12 20:16:27 · 142 阅读 · 0 评论 -
高频面试考点(考察分治法):合并k个排序链表
文章目录题目题目解析解题代码题目题目解析很明显,这种多个有序链表的排序可以分解为,两个过程:合并两个有序链表的函数。实现多次调用合并两个有序链表。关于分治法如何优化该过程的?很明显如果直接从左往右调用多次合并两个有序链表来实现需要调用n-1次,而分治法通过先把数组分割成两个数组元素为一个基本的操作对象,那么很明显可以优化为调用logn次。以下是两种方式的时间差距:解题代码朴素解法class Solution {public: ListNode* mergeKL原创 2021-06-11 23:56:38 · 186 阅读 · 2 评论 -
自构物品的完全背包问题(完全平方数)
文章目录题目题目解析二维dp+自建物品一维dp+自建物品一维dp+非自建物品题目题目解析首先声明这就是一个完全背包问题,为什么呢?因为题目就是需要你找到完全平方数去填补数字n使得填补所用的完全平方数最少,而这些完全平方数可以无限使用。显然我们不清楚的就是背包内要装的物品,因为题目并未给出。关于背包内要装入的物品,我们根据题意可知是小于sqrt(n)的完全平方数,所以我们可以通过枚举1~sqrt(n)范围内的完全平方数得到背包内要装入的物品。有这个物品后,我们就完全可以看作是零钱兑换给原创 2021-06-11 16:34:42 · 175 阅读 · 1 评论 -
面试常考算法题(考察单调队列)--滑动窗口的最大值
文章目录题目题目解析第一时间想到用暴力法用单调队列题目题目解析这道题难的地方在于不能超时。。。O(n^2)必超时为了防止重复比较,我们可以采取两个策略:用优先队列构建最小堆。用单调队列保存前几个最大值以防止重复比较。这两种方法当然都存在一个问题=>需要判断当前的最大值是否存在于当前的窗口内,这个问题可以很简单的在这两种结构中得到解决,如果是优先队列我们只需要将下标和值同时保存,而如果是单调队列,那么我们可以保存下标即可。第一时间想到用暴力法看到这道题,很容易想到分割区间,原创 2021-06-10 19:07:45 · 114 阅读 · 0 评论 -
多属性背包进阶--盈利计划
文章目录题目题目解析解题代码三维数组实现压缩一维得到二维形式题目题目解析题目描述第i种工作产生两个属性–产生的利润和需要的人数。而题目的含义在于:给你n个员工,问给他们分配工作后,产生至少是minProfit利润的计划总数(即不同的分配工作情况)。这与之前做过的一道多属性背包不可谓不相同:字符串装0和1分析:此题明显和之前所做过的一道多属性背包类似,只不过这题的多属性较难看出,这题的属性也是两个,员工人数和所需的最小利润数,故根据这两个属性构建背包得dp关系 dp[i][j][k] =原创 2021-06-09 23:27:09 · 199 阅读 · 0 评论 -
面试常考:成环法的应用--寻找环的起点得到重复的数字
文章目录题目做这题之前需要了解的题目题目解析解题代码题目做这题之前需要了解的题目leetcode142题成环链表II原理是通过快慢指针判断是否有环,然后通过距离关系,从头同步遍历找到起点。解题代码class Solution {public: ListNode *detectCycle(ListNode *head) { //只需要判断fast指针是否null就行,毕竟在最前面 ListNode* slow = head; Li原创 2021-06-08 23:08:34 · 173 阅读 · 1 评论 -
子集背包再进化--石子对撞问题
文章目录题目题目解析解题代码题目题目解析个人手写的详解,感觉已经比较详细了,接下来就是根据这个思路写下dp函数,利用dp背包分堆得到背包种的最大值,这是很多题目的惯用伎俩。此处的sum/2实际上无论sum是偶数还是奇数都不影响它的小的那一堆(反正sum/2是向下取整)解题代码二维数组形式class Solution {public: int lastStoneWeightII(vector<int>& stones) { //accumul原创 2021-06-08 19:45:04 · 87 阅读 · 0 评论 -
最长连续序列(区别于LIS)考察集合的查找
文章目录题目题目解析题目题目解析题目解析:首先要读懂题,由于不是子序列,而是序列,那么不会要求从左到右的顺序。做题步骤:通过set将原数据去重。通过遍历set找出连续数据的首元素。(通过查找num-1是否存在于集合中)根据连续数据的首元素来更新这个连续数据的长度。class Solution {public: int longestConsecutive(vector<int>& nums) { unordered_set<int原创 2021-06-07 23:25:35 · 90 阅读 · 0 评论 -
从dfs暴力->记忆化->子集背包dp->滚动数组优化
文章目录题目简单的dfs爆搜回溯记忆化优化(重头戏)子集背包dp题目详解代码详解滚动数组优化题目简单的dfs爆搜回溯擦墙而过class Solution {public:int n; int findTargetSumWays(vector<int>& nums, int target) { n = target; backtrack(nums,0,0); return res; }private:i原创 2021-06-07 13:51:17 · 198 阅读 · 2 评论 -
缺失的第一个正数(原地关系映射方法)
文章目录题目题目解析解题代码题目题目解析乍一看,可能很多人一下可以写出好几版解决代码。但无一例外,基本上想不出如何既实现O(n)时间复杂度,有实现O(1)时间复杂度。这也是为什么此题被划为困难题。。。解题策略:我们可以把给定的数组当作一个hash表来用,怎么用呢?把nums[i]和下标i形成一组映射关系,也就是nums[0]=1,nums[1]=2...搞清楚这个之前,得搞清楚题意,题意是要找出连续的正数中缺失的最小正数,那么我们就可以得出我们所要找的这个最小正数的最大值和最小值,最原创 2021-06-06 21:33:37 · 222 阅读 · 0 评论 -
算法大师孙膑--田忌赛马(转自labuladong)
文章目录古人智慧对应算法题解题思路解题代码(java和C++)古人智慧田忌赛马的故事大家应该都听说过:田忌和齐王赛马,两人的马分上中下三等,如果同等级的马对应着比赛,田忌赢不了齐王。但是田忌遇到了孙膑,孙膑就教他用自己的下等马对齐王的上等马,再用自己的上等马对齐王的中等马,最后用自己的中等马对齐王的下等马,结果三局两胜,田忌赢了。当然,这段历史也挺有意思的,那个讽齐王纳谏,自恋的不行的邹忌和田忌是同一时期的人,他俩后来就杠上了。不过这是题外话,我们这里就打住。以前学到田忌赛马课文的时,我就在想,如转载 2021-06-06 16:11:45 · 701 阅读 · 0 评论 -
每日一题--多属性的01背包问题
文章目录题目题目详解三维空间实现多属性01背包滚动数组到二维空间题目题目详解什么是多属性的背包问题?比如对于这道题,它可以看作是一个具有装下物品两个属性的背包(装下0和1),它的容量可以看作是[j][k]可用二维数组来表示,而外面一层和普通的01背包问题一样,用于表示在有多少个物体的情况下装下物体的个数。那么dp数组定义如下–dp[i][j][k]表示给出前i个物体,并且背包容量为[i][k](装下1和0的容量)的情况下所能装下的最多物体,由于对于每个物体是一个字符串,每个字符串有0或者1两原创 2021-06-06 15:07:10 · 443 阅读 · 0 评论 -
简单的dfs搜索却蕴含着小细节--生命游戏
文章目录题目不注意小细节酿成大错!不用额外临时数组,原地操作题目不注意小细节酿成大错!本来看完题目想着开开心心直接dfs搜索AC即可,可是却半天调试不知错在哪(程序员最怕你写的代码不按照你想的答案出结果,否则半天调试不出来)…后面仔仔细细从头看到尾,发现一个小细节酿成大错。。。我竟然直接原地改了原数组的数据,所以导致后面count的更新结果都出错。。。代码class Solution {private: //八个方向遍历更新 const int dx[8] = {-1,1,0,0,原创 2021-06-05 23:10:09 · 107 阅读 · 0 评论 -
几数之和两种题型总结(hash表、二分、双指针)
几数之和的总结如果是问几数之和各个数的组合数,如之前的三数之和那题,一般是用到二分或者双指针这种能够得到具体数字情况的方法来降低循环的层数。如果是问几数之和中符合情况的个数,一般都是用hash表降低循环层数,此时我们只需要关注答案的次数即可。显然此题属于第二种情况。如何用hash表降低循环层数?题目比如对于这题,原本需要四个循环才能枚举出所有的四数之和情况,此题需要满足的条件为:A[i]+B[j]+C[k]+D[l]=0 =>A[i]=-(B[j]+C[k]+D[l])原创 2021-06-04 18:36:31 · 150 阅读 · 0 评论 -
三种方法遍历螺旋数组(dfs、四个方向模拟、层层模拟)
题目dfs解决class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { m = matrix.size()-1; n = matrix[0].size()-1; dfs(matrix,0,0); return res; }private: int m; int原创 2021-06-03 22:51:29 · 504 阅读 · 0 评论 -
前缀和的一周---连续数组
文章目录题目解题分析解题代码题目解题分析关于子数组和的问题,很快可以联想到前缀和(当然有时也想到滑动窗口),此题是二进制的相同数字问题,如果直接的前缀和,很明显只能通过暴力求解,想要优化为一次遍历的O(n)复杂度,就需要具备满足条件的子数组的头和尾前缀和能通过某种关系对应,比如昨天的同余关系,今天这个似乎无法直接求前缀和得到关系。关于数组某两个数的相同数量判断,我们一般可以运用+1-1最终为零的方式,同样这道题的前缀和也可以通过该方式(遇到0 -1,遇到1 +1),如果某个子数组符合相同数量,那原创 2021-06-03 18:07:30 · 78 阅读 · 0 评论 -
多种解法解决高频面试题--除自身以外数组的乘积
文章目录题目解题总体思路利用两个数组前缀积(O(n)空间复杂度)状态压缩降维打击(把一维数组变为变量)O(1)空间复杂度继续优化时间复杂度(一次遍历)题目解题总体思路答案数组的每一个位置的数据,都可以看作其左边所有数组元素和右边所有数组元素的乘积。假设nums = {1,2,3};则res[0] = 1(这是左边数组的特殊情况)* nums[1]*nums[2](右边数组);res[1] = nums[0](左边的数组) * nums[2](右边的数组);同样最右边的数组也有特殊情况,它的右边原创 2021-06-02 20:25:50 · 151 阅读 · 0 评论