- 博客(46)
- 收藏
- 关注
原创 力扣第七十一题(简化路径)
这道提设计是思想就是模拟,先用一个输入流来判断路径中有没有多余的符号,同时将其中的转到上一层路径的符号跳出栈。下面代码就是用栈来模拟具体的操作。
2022-09-29 22:29:35 264 1
原创 力扣第六十二题(不同路径)详解
这是一道很经典的DP题,我们根据题意可以很快地看出机器人只能从[i - 1][j]和[i][j - 1]走来,根据此我们可以得到表达式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],后面的写法就很简单了,加上初始值,就是本题的答案。
2022-09-09 20:42:55 173
原创 力扣第六十一题(旋转链表)详解
再进一步,我们需要将链表的头指针向右移动k个位置,由于需要移动整个数组,所以我们可以考虑将其闭环,将尾指针指向头结点,这样只需将尾指针再移动n - k个位置,再将其下一个next结点作为头结点,然后将其指向空结点,这样就完成了运动。当然还有一种快慢指针的解法,前面的步骤和上面的一样,后面我们用快指针先移动k个位置,再和慢指针一起移动到尾部,这时慢指针指向的就是第n - k个位置,将其下个结点作为头结点,快指针指向head头结点,再将慢指针指向空,即完成了移动。
2022-09-05 22:48:39 164
原创 力扣第五十九题(螺旋矩阵)详解
和螺旋矩阵I一样,我们都是用模拟来解决,唯一的不同为我们需要解决数字在数组中的排序,只需要定义一个初始数,然后在模拟的时候逐步加一,就可以得到最后的结果。
2022-09-03 16:32:06 139
原创 力扣第五十七题(插入区间)详解
首先他给出的数组为无重叠的,所以我们仅仅需要考虑的就是如何插入newIntervals,插入区间的位置只有三种可能,一种是在给定数组任意一区间的左边,一种是在给定区间的数组任意区间的右边,还有一种就是存在重叠。前面两种情况很任意考虑,最后一种情况我们只需要在重叠的区间里面找到最小的作为区间的左端点,最大的作为区间的右端点。遍历到插入区间左端点大于给定右端点,这时将前面的区间都加入到result中,再讲其进行比较,取大的作为右端点,小的作为左端点,加入到结果中,最后将剩下的数组加入到数组中。
2022-09-01 22:20:49 170
原创 力扣第五十六题(合并区间)详解
题目既然要求合并数组,我们可以选择对数组的起始位置和截止位置进行排序,然后一步步比较来排除重复的区间。对于该思路我们可以用双指针来遍历,当 i 区间的右端点小于排序后i + 1区间的左端点,不用进行处理,继续遍历,当大于左端点时,将 i 的左端点和i + 1 的右端点组成一个新区间。...
2022-08-31 14:50:30 197
原创 程序设计与算法--动态规划
动态规划在我们解题时十分重要,动态规划的思想其实很容易掌握,只要是学会怎样去灵活运用,把题目给出的条件进行拆解,得到“最优子结构”以此来得到递归公式,当然既然用到了递归,减枝也是非常的重要,我们同样也可以把递归转化为递推型。......
2022-08-30 16:38:38 333
原创 力扣第五十三题(最大子数组和)详解
这道题我们考虑用到动态规划,首先用一个数记录临时的数组和大小,当现在的数组和小于0时,重置数组和,最后取最大的数组和。[-2,1,4,-1,2,-1,-5,4],我们可以观察到最大数组和为6,实际算法结果也为6,这是因为当加上一个数后,不管大于还是小于0,我们都会和以前的数组和比较,取最大的那个。其根本思想为动态规划。题目看起来很简单是不是,但当你真正开始写的时候,就会怀疑人生。...
2022-08-25 20:31:36 288
原创 程序设计与算法---深度优先搜索(DFS)
深度优先搜索其实就是在图上找目标点,以起始的点开始,向每个点进行搜索,直到找到目标点。在实际的解题过程中解题过程中,DFS通常是以回溯的考法最多,也最难,后面列出的题目也都是回溯解法居多,这种解法被称为“万能方程式”。
2022-08-23 20:20:06 1386
原创 力扣第五十题(Pow(x,n)详解
轻轻松松的就完成了这道题,但这样很不好,下面介绍改题的快速幂解法。,总共需要5次平方(中间奇数需要乘以x,x的5次方为32),看到题目首先想是不是很简单。,总共需要7次平方(x的6次方为64)。所以我们可以得到快速幂的公式。可以拆分成什么,x→。可以拆分成什么,x→。
2022-08-23 15:39:56 404
原创 力扣第四十九题(旋转图像)详解
但如果直接在原矩阵中旋转,就需要进行一定的推导和计算。我们观察旋转数组,可以发现 左上角的数向右上角旋转,右上角的数向右下角旋转,右下角的数向左上角旋转,这样我们就可以模拟出相应的程序。我们可以直接将数组进行旋转,先上下旋转,再右上半边和左下半边旋转,可以直接得到答案。
2022-08-22 15:53:58 148
原创 力扣第四十六题(全排列)详解
用一个bool型数组记录该数是否用过,当然为了避免数组中有重复数,我们记录的是数组的下标。然后用一个二维数组储存答案,一个一维数组储存每一次回溯时的结果,后面的步骤就是典型的回溯套路,进栈,回溯出栈,然后可以得到最后的结果。题目意思很好理解,给定数组的全排列,对于此种类型的题目,应该首先想到回溯,可以很轻松的解决该问题。下面给出两种回溯算法的题解。由于最后所求数组都是nums的全排列,所以我们可以直接将nums中的数每一个之间进行交换,然后回溯得到最后的结果。
2022-08-19 17:27:13 246
原创 力扣第四十五题(跳跃游戏II)详解
首先需要考虑的是在能跳到最后终点的情况下,如果存在多种解,怎样取得他们之间的最小值,这个问题,我们用贪心的基本思想解决,每次取能跳到范围的最大值,再在其中取得在从当前起始最远下标到下一步最远下标中的最大值,如果当前下标移动到下一步最远下标,还没有到达终点的话,则继续更新当前最远下标,直到到达最后下标。下一种的方法思路较为清晰,代码也很简洁,整体和上面的大同小异,当下一步的覆盖范围到达了最右侧时直接将步数加一,不再进行下一步操作。和跳跃游戏I一样,解法都是贪心,只不过相较于I难度有很大的提升,...
2022-08-18 15:36:55 851
原创 力扣第五十五题(跳跃游戏)详解
从后向前,如果当前位置能跳到最后位置,即能记下该位置并且更新目标距离n,最后判断当遍历到 i==0 时n的值,即可得到结果。当然改题也可以用从后向前遍历的算法,时间复杂度是一样的。
2022-08-17 17:09:54 727
原创 说说二分查找算法
解法:由于已经给出了方程的系数,所以我们可以计算出该方程在[0,100]内是单调递增的,有且只有一个根,此时我们可以考虑枚举,但这样的写法会有很大的时间复杂度,所以我们可以用二分法在区间中找寻答案。模板一:写一个函数BinarySearch,在包含size个元素的,从小到大排序的int数组a里查找元素p,如果找到,则返回元素下标,如果找不到,则返回-1,要求复杂度O(log(n))如果复杂度为多个n的函数之和,则只关心随n的增长增长得最快的那个函数。对于时间和空间复杂度的计算,也是有一定的方法。......
2022-08-14 22:22:40 293
原创 力扣第四十三题(字符串相乘)详解
根据题意,我们可以将其拆解为num1乘以num2中的每一个数,再将其相加可得,这个思路是我们做乘法时最常见的思路,其中需要的注意的是当从右遍历到左时,除最右边的数,其他的数相乘后需要在其后面加上0,用于补位。由于m位整数和n位整数相乘后得到的结果为m+n位或m+n-1位,所以我们可以用m+n大小的数组储存相乘后的结果,然后再从后向前遍历,将其取模进位,最后转化为字符。先将其每一位转化为整型,再逐个相乘,同时判断是否进位,最后算得每一位num2乘以num1的值,最后将其相加得到最终的结果。...
2022-08-14 21:08:42 290
原创 力扣第三十九题(组合总和)详解
具体到这道题的解法,用ans存储最后的答案,也就是二维数组,再用一个combine存储每次回溯得到的数组。对于回溯函数,以索引值idx来遍历candidates中的数,每加入一个candidates中的值,就判断combine中的值是否和等于目标值target,当递归到最后发现值并不等于target,及时退栈,再继续遍历其他的值,当idx等于candidates的大小,这是已经遍历完整个数组。这是一道经典的回溯算法题目,回溯的典型模板为一个for循环遍历,同时也作为回溯的出口,再加上一个递归来深度遍历。..
2022-08-05 09:58:37 202 1
原创 力扣第三十八题(外观数列)详解
这个函数的意思就是数以“1”为countAndSay(1)开始,countAndSay(2)就是1个“1”也就是11;countAndSay(3)就是2个“1”也就是21。这道题的思路就是以此计算countAndSay(1)到countAndSay(n)以此来得到最后的结果,当然,鉴于本题的测试用例较少,n最大为30,所以可以考虑用打表的方式,面向测试编程。这道题的题目上面描述的很清楚,主要的意思是给出一个数n,要求的就是countAndSay(n)。...
2022-07-31 16:12:48 81
原创 力扣第三十六题(有效的数独)
用两个二维数组储存横纵坐标并记录出现的次数,再用一个三维数组判断在一个3*3的方格内是否有重复的数字。用两个for循环遍历数组,以此来完成对数组的判断。数独大家应该都很熟悉,所以理解题意对我们来说是很任意的,但刚开始看这道题的时候,还是被搞的头大,其实这道题的解题思路很容易理解,下面来具体讲述一下。...
2022-07-30 17:07:03 135
原创 力扣第三十四题(在排序数组中查找元素第一个和最后一个位置)详解
具体思路为先赋初始值,求右边界时,判断中间值和目标值的大小关系,当中间值大于目标值大小时,证明目标值在数组的左边,则将右指针指向中间值。因为题目给出了限制所以和上一题类似,也是用二分法来解决,由于他给出的数组排序为升序排列,所以可以直接在其中查找左边界和右边界。其实对于求左右边界,可以直接看成求target值和target+1在数组中的下标,即左边界为target,右边界为target+1。先确定左边界的下标,再确定右边界的下标。对于右边界,我们由左靠近,左边界则由右靠近。...
2022-07-28 16:17:46 315
原创 力扣第三十三题(搜索旋转排序数组)
思路判断数组中间下标值的大小和数组左值和数组右值比较,若中间值大于数组右值,则证明左半段为有序数组,中间值可能为翻转后左半端数组中的一个,同样,若中间值小于数组右值,则证明数组右半段为有序数列,此时该值可能为数组翻转后右半段数组的一个。可是这明显是错的,仔细的研究题目会发现他的意思是给定的数组是一个升序排列的数组按照从某个未知的下标经过翻转后的数组。其实我们可以不管他从那个下标翻转,题目的意思就是告诉你,它给的数组就是按照升序和另外一半的降序排列的(也可能不是,也可能为单个数)数组。...
2022-07-27 20:46:02 161
原创 力扣第三十一题(下一个排列)
找到具体的实现方法从给定数组的尾部,用一个指针指向尾部向前遍历,再用另外一个指针指向尾部,同时这个指针只能再前一个指针的后面,以此前一个i指针固定一个数,另外一个指针在(n-i-1)的范围内寻找比i指针指向的数大的值,如果没有,i指针继续向前移动,另外一个指针重复上面操作。如果遍历到最后还是没有找到,证明该数组是完全倒序的,依据题意可以直接将其倒过来。题目描述的意思是知道给定数组的下一个比它大的数组,而且只能大一点点,也就是根据给定数组的全排列顺序,找到该数组的下一个排列数组。...
2022-07-26 16:29:38 224
原创 力扣第二十九题(两数相除)详解
解题的具体思路就是先要判断被除数的值是否为int最大值,同时被除数为-1,此时答案应该为int的最大值,再用除数和被除数的异或运算得到两数是否同号,再逐个尝试被除数的绝对值除以2的i次方来得到一个最大的i,使得被除数除以2的i次方大于或等于除数,此时得到的数就是被除数除以除数后得到的最大的2的次方,再用得到的数再除以2的i次方,同样的道理,这时便可得到最后的答案。例如10/2^1>=3,5/2^0>=3。但该方法需要判断的边界条件太多,需要扣很多的细节。...
2022-07-25 16:43:01 217
原创 力扣第二十四题(两两交换链表中的结点)详解
该题的终止条件为链表遍历完或者链表只剩一个元素时,返回值为上一次交换完成的链表,递归函数为head->next=swapPairs(newHead->next).重复操作交换链表中的两两相邻结点,所以我们可以想到用递归来完成这件事。递归的题也可以用栈来完成迭代的操作,下面是两种思路的代码详解。递归三步曲终止条件,找到递归一次后的返回值,找递归的函数。该方法就是递归的实现,简单清晰易懂。...
2022-07-23 16:06:59 64
原创 程序设计与算法---枚举
例如求小于N的最大素数我们找不到一个数学公式,使得只要给出N就可以计算出这个数,但我们可以一个一个来列举出来,如我们逐个尝试N-1,N-2.........这样可以非常直观简洁的实现最直白的解题思路,我们在具体解题时,不管题目的难度如何,能用枚举解决的题目还是占大多数的(虽然会超时)。题目很清晰,我们最先想到的是a,b,c,d分别从0列举到N,可是这样子是很不好的,枚举虽然不要动脑筋,但也不能太过直接。我们还可以对程序进行进一步的优化和减枝。......
2022-07-21 22:28:28 301
原创 力扣第二十二题(括号的生成)详解
该题可以运用递归解答,,思路就是根据左括号和右括号的匹配来完成。该方法代码较为臃肿,但很任意可以考虑到。思路与上一个基本类似。方法三较方法二有所改进,代码更加简洁一点。该方法思路较为清晰,而且任意理解。...
2022-07-21 16:26:32 356
原创 力扣第十九题(删除链表的倒数第N个结点)详解
所有方法的核心思路是找到倒数第n个结点,然后上一结点的next指向下下一个结点,也就是下一节点的next,只不过实现的方法不同罢了。创建一个哑结点指向链表的,可以省去对头结点的特殊判断,然后利用栈,将链表中的值一个一个的压入栈中,再弹出n个结点,这样栈里的头指针就是倒数第n个结点。该方法较前面的简单一点,就是遍历链表,得到链表的长度,然后确定倒数第n个结点在链表中正着数的位置,再把指针定位到这个位置,完成删除操作。先定义一个全局变量cur,以此来记录指针的移动,当cur等于n时,这时即到了倒数第n个结点。.
2022-07-20 17:25:46 493
原创 力扣第十八题(四数之和)详解
该题和前面的三数之和解法思路是一样的。用两重循环for嵌套,三个指针依此指向数组的前三个数,前两个指针用for循环,另外一个指针和指向数组末尾的指针根据条件判定运动。但需要注意减去一些不必要的循环,比如target和数组的第一个数nums【0】中有一个大于0,且nums【0】大于target,至于为什么要加上判定他俩其中一个大于0,是因为两个负数相加值是减小的。同理可以在第二重循环中前两个数相加和target比较。......
2022-07-19 16:55:40 178
原创 力扣第十七题(电话号码的字母组合)详解
具体思路,先用数组储存相应的字符串,然后从输入的字符串中从索引0开始,将对应得到的字符串加入到字符串s中,然后索引加一,继续得到下一个字符对应的字符串,如果索引的值等于字符串的长度,则将其加入到result中,并进行回退,继续进行下一个。该题目的描述简单易懂,生活中是很常见,解题的方法和思路是用哈希表储存相应的值和字符串,下面给出的思路中中心思想大致相同。具体的思路是建立一个哈希表储存数字和对应字符串的。其余思路与上一个相同。...
2022-07-18 10:58:59 278
原创 力扣第十五题(三数之和)详解
看到题目首先想到两数之和,两数之和的解法很普通,就是先对数进行排序,然后利用双指针,一个指向左边,一个指向右边。当两指针之和大于目标值时,移动右指针,当和小于目标值时,移动左指针。但开始的时候,大家最先想到的是利用三个for循环来遍历数组,这样虽然可以一样解出来,但所需的时间复杂度太高,所以需要改进算法。具体思路是将其类比与两数之和,先固定一个“目标值”,然后利用双指针,分别从左和右遍历数组,判断其与“目标值”的大小关系,同时因为题目要求不能包含重复的三元组,所以在遍历的时候需要注意判断其值是否重复。...
2022-07-16 17:43:09 357
原创 力扣第十二题(整数转罗马数字)详解
简单的介绍一下pairpair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。用两个数组储存相应的特殊值和对应的符号,将num与值从小到大比较,当num大于相应的value值时,将与之对应的罗马字符加上字符串,直到num的值为0。其实思路和方法一类似,也是储存特殊的值和对应的罗马符号,只不过只是简单的改了一下储存的方式,用c++中的pair储存。...
2022-07-15 21:28:43 359
原创 力扣第十一题(盛最多水的容器)详解
根据题目可以想到的解决方法为双指针,左指针指向最左端,右指针指向最右端,在移动前判断俩指针所指向值的大小,当左指针指向的值大于右指针,移动右指针,再继续比较,直到俩指针重合。下附代码:...
2022-07-14 10:09:59 211
原创 力扣第八题(字符串转换整数 (atoi))详解
首先解释一下题目中的atoi,它其实是C语言中的库函数,主要的作用是将字符串转换为int整数,与此相类似的还有atol:把字符串nptr转换为long int。atol:把字符串nptr转换为long long int。atoq:atoq() is an obsolete name for atoll()。接下来我们来分析题目。方法一:根据题目的描述,可以想到模拟来解决这道题,跟据题目的提供的思想,一步一步的模拟,同时还应该考虑到模拟时的边界问题。代码如下所示方法二:该题还有一种叫自动机的解法,就是利
2022-07-13 10:22:32 244
原创 力扣第七题(整数翻转)详解
这道题如果不是会发生溢出,其实可以算上是一道非常简单的题目。根据题目可以很快的写出最基础的代码,如下所示 接下来的事情就是考虑如何解决溢出的问题,也就是捕获溢出异常。在c++里面有定义了INT_MAX和INT_MIN 分别表示最大和最小整数,定义在头文件limits.h中。其中INT_MAX = 2^31-1,INT_MIN= -2^31。所以可以直接得到最后的代码,如下所示:...
2022-07-12 10:31:01 178
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人