自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 [LeetCode](面试题62)圆圈中最后剩下的数字

解题思路约瑟夫环问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。递推公式:F(n, m) = (F(n-1, m) + m) % n。F(n, m) 表示有n个人参与报数,每次将第m个人杀掉,最后胜利者的数组下标,其中n表示参与报数的总人数,m表示报到第m个人时将其杀掉。推理步骤:1、当n=1时,那么他就是胜利者...

2020-03-30 23:10:01 35

原创 [LeetCode]1162. 地图分析

解题思路(可以参考腐烂的橘子一题)994.腐烂的橘子这里可以把陆地想象成腐烂的橘子,海洋是新鲜的橘子,我们的目的就是由最初的陆地逐渐扩散到海洋,最后扩散到的海洋就是要求的目标区域。找到一个海洋区域,这个海洋区域到与它最近的陆地区域的距离是最大的。首先解读一下“最远”和“最近”分别指什么意思。1)距离陆地区域最远的海洋区域,就是指从陆地开始,要扩散多少次,才能把所有的海洋给覆盖掉。“最远”应...

2020-03-30 23:08:35 26

原创 [LeetCode]820. 单词的压缩编码

解题思路解法一:反转+排序假设有一对单词a和b,如果a是b的后缀,比如me是time的后缀,那么就删除单词a。当遍历完所有单词后,剩下的单词就是构成索引字符串的单词。关键之处是怎么找出这些单词来,如果正向遍历单词则太过麻烦,所以本题思路就是逆向遍历单词,所以先将所有的单词进行反转,并按字典序进行排序。如果a是b的后缀,那么反转后a’就是b’的前缀,按字典序排序后,b’就紧跟在a’后面。对按字典...

2020-03-29 12:24:37 22

原创 [LeetCode]914. 卡牌分组

解题思路一开始我是先取得不同种类中出现次数的最小个数,判断的时候用所有出现的次数来取余这个最小值,后来一个测试样例过不了,猛然发现原来是求不同种类之间出现个数的最大公约数。所以只需计算出不同种类次数间的最大公约数X即可。如果X大于等于2则返回True,否则返回False。复杂度分析:时间复杂度:O(NlogC),其中 N 是卡牌的个数,C 是数组 deck 中数的范围,在本题中 C 的值为 ...

2020-03-28 12:11:55 31

原创 [LeetCode]999. 车的可用捕获量

解题思路解法一:暴力穷举先找出车所在的行与列,然后分四个方向遍历寻找,分三种情况:1)要么当遇到象则退出本方向循环;2)要么遇到第一个卒时,计数加一,然后退出本方向的循环;3)要么到棋盘边缘也没遇到卒,则退出本次循环。最后返回总个数即可。复杂度分析时间复杂度:O(n^2),其中 n 是棋盘的边长。找白色车在棋盘中的位置需要 O(n^2)的时间复杂度,模拟车在四个方向上捕获颜色相反的...

2020-03-28 12:10:57 27

原创 [LeetCode]892. 三维形体的表面积

解题思路这题主要还是考验空间想象能力吧。起初是想用投影法做的,但发现如果形体中间有洞的话则不行。所以还是用每个立方体的表面积总和减去和周围立方体重叠的面积来算。总体思路就是总表面积 = 立方体数 * 6 - 重叠面 * 2,重叠面又可以分为三部分:(1)每个格子内的垂直方向上的立方体底/顶面重叠;(2)左右格子之间的立方体的侧面重叠;(3)前后格子之间的立方体的侧面重叠。最后注意一下边界条件就...

2020-03-28 12:09:21 34

原创 [LeetCode]198. 打家劫舍

解题思路动态规划:(与面试题17.16按摩师属于同一题型)定义 dp[i][0] 表示第i家不偷,dp[i][1]表示第i家偷。根据题意,相邻的房屋不能偷。因此当第i家不偷时,第i-1家偷不偷都可以,则 dp[i][0] = max(dp[i-1][0], dp[i-1][1]);而当第i家偷的时候,第i-1家不能偷,则dp[i][1] = dp[i-1][0]+nums[i],最后返回ma...

2020-03-28 12:08:48 14

原创 [LeetCode](面试题 17.16)按摩师

解题思路动态规划:定义 dp[i][0] 表示第i个预约不接,dp[i][1]表示第i个预约接。根据题意,相邻的预约不能接。因此当第i个预约不接时,第i-1个预约接不接都可以,则 dp[i][0] = max(dp[i-1][0], dp[i-1][1]);而当第i个预约接受的时候,第i-1个预约不能接,则dp[i][1] = dp[i-1][0]+nums[i],最后返回max(dp[n]...

2020-03-28 12:08:15 28

原创 [LeetCode]876. 链表的中间结点

解题思路解法一:数组遍历链表,并将链表中的元素存入数组A。假设一共遍历到N个元素,最后返回数组A[N/2]即可。复杂度分析时间复杂度:O(N),其中 N 是给定链表中的结点数目。空间复杂度:O(N),即数组 A 用去的空间。解法二:单指针对链表进行两次遍历。第一次遍历时,我们统计链表中的元素个数 N;第二次遍历时,我们遍历到第 N/2 个元素(链表的首节点为第 0 个元素)时,将该元...

2020-03-28 12:07:32 18

原创 [LeetCode]945.使数组唯一的最小增量

解题思路首先将数组从小到大进行排序。对于数组 a<b<c,如果a重复了,并且只有增加到c才保证不重复,那么从a直接增加到c的次数,与先从a增加到b,然后b重复了,再将b增加到c,所用的增加次数是一样的。即 c-a = b-a+c-b。所以,增加的过程不重要,只要最后得到的结果相同就行。贪心算法在于每个子问题的局部最优解会指向全局最优解。显然在对数组排序之后,可以通过保证每轮遍历数组...

2020-03-28 12:06:41 28

原创 [LeetCode]365.水壶问题

解题思路裴蜀定理(或贝祖定理),说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。它的一个重要推论是:a,b互质的充要条件是存在整数x,y,使ax+by=1。对于本题,我们可以认为每次操作只会给水的总量带来 x...

2020-03-28 12:06:02 19

原创 [LeetCode](面试题40)最小的k个数

解题思路解法一:排序对原数组从小到大排序后取出前 k 个数即可。复杂度分析:时间复杂度:O(nlogn),其中 n 是数组 arr 的长度。算法的时间复杂度即排序的时间复杂度。空间复杂度:O(logn),排序所需额外的空间复杂度为 O(logn)。解法二:堆排序堆的定义:堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:1)堆中某个节点的值总是不大于或不小于其父节点的值...

2020-03-28 12:04:42 53

原创 [LeetCode]409. 最长回文串

解题思路既然是求最长回文串,那么左右字符个数应该对称。对于偶数个字符来说,正好可以左右排列;而对于奇数个字符来说,除了左右排列需要的偶数个字符外,还要有一个中心点。注意,对于所有的奇数字符,回文串只需一个中心点就够了。如果左右对称字符个数之和小于原串长度,说明有奇数个字符,最后需要加上一个中心点;否则就全为偶数个字符。代码class Solution: def longestPali...

2020-03-27 00:34:54 18

原创 [LeetCode]5.最长回文子串

解题思路解法一:暴力法(超时)根据回文子串的定义,枚举所有长度大于等于2的子串,依次判断它们是否是回文;在具体实现时,可以只针对大于“当前得到的最长回文子串长度”的子串进行“回文验证”;在记录最长回文子串的时候,可以只记录“当前子串的起始位置”和“子串长度”,不必做截取。步骤:1)对长度小于2的字符串进行特判;2)枚举所有长度大于等于2的字符串,并判断其是否是回文,这里可以单独写一个...

2020-03-27 00:34:20 26

原创 [LeetCode]836.矩形重叠

解题思路解法一:逆向思维直接证明两个矩形相交的情况会有很多种,所以可以逆向考虑两个矩形不相交的情形。不妨假设固定矩形 rec1,如果矩形rec2与rec1不相交,则rec2在rec1的四周,也就是说至少满足以下四种情况中的一种:rec2在rec1的左边rec2在rec1的右边rec2在rec1的上边rec2在rec1的下边对于rec2在rec1的左边而言,即rec2在x轴上的最大值不...

2020-03-27 00:33:46 15

原创 [LeetCode]1160.拼写单词

解题思路对于一个单词 word,只要其中的每个字母的数量都不大于 chars 中对应的字母的数量,那么就可以用 chars 中的字母拼写出 word。所以我们只需要用一个哈希表存储 chars 中每个字母的数量,再用一个哈希表存储 word 中每个字母的数量,最后将这两个哈希表的键值对逐一进行比较即可。复杂度分析:时间复杂度:O(n),其中 n 为所有字符串的长度和。我们需要遍历每个字符串,...

2020-03-27 00:33:14 16

原创 [LeetCode](面试题 01.06)字符串压缩

解题思路题意很简单,直接从左向右遍历字符串即可,分别设置 i、j 两个指针,i 指向当前字符,j 从当前字符i向后遍历,当 j 遍历到与 i 字符不同时,表示遍历到了一个新的字符,则i字符的个数为 (j-i),最后将i字符与个数拼接即可。步骤:1)判断字符串是否为空串,是则直接返回空串;2)分别设置 i、j 两个指针,初始值都为0,进入循环,直到 j 到达字符串末尾,即 while j&l...

2020-03-27 00:32:43 41

原创 [LeetCode]695.岛屿的最大面积

解题思路深度优先搜索:当遍历到网格中的一块土地时,如果没有访问过,则对其进行访问,置访问标记,并且对其四周的土地递归进行访问,每访问到一块以前未访问过的土地,那么数量就加1,最后返回该土地所连接的岛屿面积。(为了确保每个土地访问不超过一次,我们每次经过一块土地时,将这块土地的值置为 0。这样就不会多次访问同一土地)最后比较历次访问过的面积,取最大值即可。复杂度分析:时间复杂度:O(R ...

2020-03-27 00:32:12 37

原创 [LeetCode]300.最长上升子序列

解题思路动态规划:定义 dp[i] 为考虑前 i 个元素,以第 i 个数字结尾的最长上升子序列的长度,注意 nums[i] 必须被选取。在计算 dp[i] 之前,我们已经计算出了 dp[0……i-1] 的值。设 j∈[0,i),考虑每轮计算新 dp[i] 时,遍历 [0,i) 列表区间,做以下判断:当 nums[i] > nums[j] 时: nums[i] 可以接在 nums[j...

2020-03-27 00:31:25 20

原创 [LeetCode]169.多数元素

解题思路解法一:排序法如果将数组 nums 中的所有元素按照单调递增或单调递减的顺序排序,那么下标为 ⌊n/2⌋ 的元素(下标从 0 开始)一定是众数。复杂度分析:时间复杂度:O(nlogn)。将数组排序的时间复杂度为 O(nlogn)。空间复杂度:O(logn)。如果使用语言自带的排序算法,需要使用 O(logn) 的栈空间。如果自己编写堆排序,则只需要使用 O(1)的额外空间。解法...

2020-03-27 00:30:52 27

原创 [LeetCode]1071.字符串的最大公因子

解题思路定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(Greatest Common Divisor)缩写为GCD。gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)gcd(a,b) = b if a%b == 0 else gcd(b,a%b)或者gcd(a,b) = a if b==0 ...

2020-03-27 00:29:21 16

原创 [LeetCode]1013.将数组分成和相等的三个部分

解题思路题目要求数组能被分成和相等的三个部分,那么数组之和必然是3的倍数,如果不满足这个先决条件,则可以直接返回False。在满足数组和是3的倍数之后,就从前往后遍历数组,则每一个非空部分的和都应当是 sum(A) / 3。因此我们需要找到索引 i 和 j 使得:A[0] + A[1] + … + A[i] = sum(A) / 3;A[i + 1] + A[i + 2] + … + A[...

2020-03-27 00:28:33 26

原创 [LeetCode]543.二叉树的直径

解题思路一条路径的长度为该路径经过的节点数减一,所以求直径(即求路径长度的最大值)等效于求路径经过节点数的最大值减一。而任意一条路径均可以被看作由某个节点为起点,从其左子树和右子树向下遍历的路径拼接得到。假设我们知道对于该节点的左子树向下遍历经过最多的节点数 L (即左子树的深度) 和其右子树向下遍历经过最多的节点数 R (即右子树的深度),那么以该节点为起点的路径经过节点数的最大值即为 L+R...

2020-03-26 17:16:54 37

原创 [LeetCode]121.买卖股票的最佳时机

解题思路动态规划法:第i天的最大收益dp[i] = max{前i-1天的最大收益dp[i-1], 第i天的价格-前i-1天中的最低价格},所以需要记录前i-1天中的最低价。则转换公式为:dp[i] = max(dp[i-1], prices[i]-minprice)步骤:1)首先开创一个n维dp数组,初始化为0(一般求最大值,则初始化为一个比较小的数),并将第1天的价格设为历史最小值 ...

2020-03-26 17:16:21 14

原创 [LeetCode]322.零钱兑换

解题思路我们采用自下而上的方式进行思考。仍定义 F(i) 为组成金额 i 所需最少的硬币数量,假设在计算 F(i) 之前,我们已经计算出 F(0)到F(i-1) 的答案。则 F(i) 对应的转移方程应为:F(i)=min[F(i -c_j)] + 1 ,其中 j=0,1,…,n-1其中 c_j 代表的是第 j 枚硬币的面值,即我们枚举最后一枚硬币面额是 c_j,那么需要从 i-c_j 这个金...

2020-03-26 17:15:50 36

原创 [LeetCode](面试题59 - II)队列的最大值

解题思路主要思路:常规的遍历求队列最大值的方法时间复杂度太高,不符合题意。因此可考虑使用一个辅助队列sup来保存队列中元素最大值的方法。具体实现方法是:如果sup不为空,并且sup的最后一位元素小于当前入队元素value的话,直接把最后一位元素弹出,直到sup为空,或sup的最后一位元素大于等于value。这就保证了sup是单调递减的,且sup的头部总是原始队列的最大值。步骤:1)初始化原...

2020-03-26 17:15:20 53

原创 [LeetCode](面试题57 - II)和为s的连续正数序列

解题思路设数列第一项为t,项数为n,则由等差数列求和公式 [t+(t+n-1)]*n/2 = s,化简得 t = [s-n(n-1)/2]/n,因为t为正整数,所以 s>n(n-1)/2,[s-n(n-1)/2] % n = 0。又项数至少为2,所以n>=2。步骤:1)初始化项数 n=2,结果数列res = [];2)进行循环,当 n(n-1)/2 < s时,即 whi...

2020-03-26 17:14:26 22

原创 [LeetCode]1103.分糖果

解题思路解法一:暴力法对小朋友们进行遍历,每次都发小朋友们应得数量的糖,直到剩下的糖不足以分发应得数量,就直接给最后那位倒霉孩子。复杂度分析时间复杂度:O(max(sqrt{G}, N)),G 为糖果数量,N 为人数。本方法的时间复杂度取决于循环到底走多少步。设总的步数为 s,用等差数列求和公式可以求得 s 步时发放的糖果数量为 s(s+1)/2。那么只要 s^2+s≥2G 糖果就可以保...

2020-03-26 17:13:48 29

原创 [LeetCode]994.腐烂的橘子

由题目我们可以知道每分钟每个腐烂的橘子都会使上下左右相邻的新鲜橘子腐烂,这其实是一个模拟广度优先搜索的过程。所谓广度优先搜索,就是从起点出发,每次都尝试访问同一层的节点,如果同一层都访问完了,再访问下一层,最后广度优先搜索找到的路径就是从起点开始的最短合法路径。BFS 可以看成是层序遍历。从某个结点出发,BFS 首先遍历到距离为 1 的结点,然后是距离为 2、3、4…… 的结点。因此,BFS 可...

2020-03-26 17:12:55 38

原创 [LeetCode](面试题 10.01)合并排序的数组

解题思路解法一:直接合并后排序(不推荐)复杂度分析时间复杂度:O((m+n)log(m+n)),排序序列长度为 m+n,套用快速排序的时间复杂度即可,平均情况为 O((m+n)log(m+n))。空间复杂度:O(log(m+n)),排序序列长度为 m+n,套用快速排序的空间复杂度即可,平均情况为 O(log(m+n))。解法二:双指针法分别为两个数组设置一个指针pa与pb,来作为队列的...

2020-03-26 17:12:02 31

原创 [LeetCode]206.反转链表

解题思路(参考官方题解,加上自己的一些思考)解法一:迭代法在遍历链表时,将当前节点的next指针改为指向前一个元素,由于当前节点没有引用其上一个节点,所以必须事先存储其前一个元素pre。在更改指针方向之前,还需要另外一个指针来存储当前节点的下一个节点。例如:1 -> 2 -> 3 -> null => null <- 1 <- 2 <- 3...

2020-03-26 17:10:45 30

原创 [LeetCode]225.用队列实现栈

解题思路1、队列与栈的区别:队列是先入队元素先出队,后入队元素后出队;栈是先入栈元素后出栈,后入栈元素先出栈。2、在python中用列表list来模拟队列,append()函数可以在list末尾添加元素,pop(i)函数可以删除第(i+1)个元素。3、主要步骤:1)首先用列表list初始化一个队列:self.q = []2)元素入栈:self.q.append()3)移除栈顶元素:即...

2020-03-26 17:07:50 36

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