第二批
1807. 矩阵转置(数学)
难度:简单;主观评价:简单。
简单模拟题+数学题(判断完全平方数)。
先判断矩阵长度是否为完全平方数(开根号然后自身相乘,判断和开根号之前的数是否一致,如果不是则直接输出 ERROR),然后开始按列遍历矩阵,每次跳过一行数字,下一行对应的位置就是下一个要处理的数字。
时间复杂度:O(n^2),其中 n 为正方形矩阵的行数,矩阵中的每个元素都会被访问一次。
空间复杂度:O(1),注意返回值所用的空间不需要参与计算。
1808. 整理工号(模拟)
难度:简单;主观评价:简单。
模拟题,没啥好说的,注意题目中说明的“合法工号”的判断条件。
不是合法工号的条件有:
- 去除所有空格后,长度大于 9 或者长度为 1。
- 第一个字符不是字母。
- 除了第一个字符之外的其他字符含有字母。
这些条件都很容易模拟,根据这些条件过滤输入数组,然后将过滤后剩下的字符串整理成题目要求的格式即可。
去重排序时需要注意 Go 语言的比较操作符在比较字符串时就是按照字典序进行比较的,所以可以直接使用比较操作符。如果遇到不是按照字典序进行排序的题目(如让你按照一定规则比较一些 IP 地址等),也可以使用 sort.Slice()
的函数参数自定义比较逻辑。
时间复杂度:O(nlogn),其中整理操作的时间复杂度为 O(m*n),n 为输入数组的长度,需要遍历输入数组一次;m 为输入数组中最长的合法工号的长度,最长为 9;O(nlogn) 为排序算法的时间复杂度;综合时间复杂度为 O(nlogn)。
空间复杂度:O(n),去重使用的哈希表占用的空间与合法工号个数成正比。
1812. 求矩阵列的最大值中的最小值(模拟)
难度:简单;主观评价:简单。
由于是找每一列的最大值,再找它们中的最小值,所以遍历矩阵的时候不能按照常规的按行遍历的方法,而是要按列遍历,每遍历一次找出一个最大值,然后找出这些最大值中的最小值。
时间复杂度:O(n*m),其中 n 和 m 为矩阵的行数和列数,矩阵中每个元素都会被遍历一次。
空间复杂度:O(1),只使用了常数个数的存储空间。
1813. 用给定的数字组成 IP 地址(递归回溯、全排列)
难度:简单;主观评价:中等。
一眼全排列,用递归回溯的方法进行求解。
注意答案要进行去重,例如“08”和“8”是同一个答案,可以使用 map 存储转换为 int 的字节数组进行去重。
搞不懂为什么这道题定的是简单,如果不知道递归回溯这种算法恐怕是做不出来这道题的,当然这题在递归回溯类问题中算是简单的,套一下递归回溯算法的模板就可以了,所以主观评价给个中等吧,毕竟 LeetCode 上涉及到递归回溯的题好像也没几道简单题。
时间复杂度:我实在是不会分析递归算法的时间复杂度,总之很高就对了,但不会超时。
空间复杂度:O(n),函数调用栈的深度与可用的数字个数成正比。
1809. 最佳升级时间窗(滑窗)
难度:中等;主观评价:简单。
一眼滑窗。
题目的难点是滑窗最长可以为周期的长度,且可以跨过周期,也就是说需要开双倍数组,或者用类似循环队列的方法解决(右指针移动时,对数组长度取模,这种方法可以将空间复杂度优化到 O(1))。
如果像我一样开双倍数组,返回时需要右指针下标对数组长度取模(样例 2)。
此外,滑窗被动收缩(左指针被动右移)的条件除了滑窗内部的数值之和大于容忍值之外,还有滑窗长度大于一个周期(需要收缩到一个周期,样例 3)。
times
变量用来记录滑窗内的数值之和,为了防止溢出需要用 uint64
类型。
以上难度都很容易想到,所以主观评价给个简单吧。
时间复杂度:O(n),需要遍历双倍数组一次。
空间复杂度:O(n),本解法中开了双倍数组模拟跨过周期的情况,需要使用与数组长度成正比的空间。
1810. 日志敏感信息屏蔽(哈希表、模拟)
难度:中等;主观评价:中等。
这题说有多难吧,也没多难,毫无算法成分就是一简单的模拟题,但是规则 3 的边界条件判断非常恶心!!!如果像考试时那样看不到不通过的测试用例的话,我绝对会在这道题上翻车的,所以主观评价给了个中等。
个人认为这种死抠细节的题比单纯的算法题难多了,最恐怖的是这种细节题不像纯算法题那样容易练习,LeetCode 上也很少有这类题目,只能说多在 OJ 上找找吧。。。
具体看注释,我翻车的地方都在注释里用“易错点”标注出来了。
细节题真的是一生之敌。
时间复杂度:O(n),需要遍历 logs 数组一次。
空间复杂度:O(n),我的解法需要将 logs 数组中的元素按照分隔符切分并保存到辅助数组中,使用的辅助数组占用的空间与 logs 数组长度成正比,可以使用直接修改 logs 数组的方法优化到 O(1)。
1811. 素数行李箱密码(BFS、层序遍历)
难度:困难;主观评价:中等。
本题与 1795. 最佳路径 相似,最大的难点是生成素数数组和想到用层序遍历 BFS 解题,算法本身是非常简单的——没错,比 1795 简单很多,甚至连邻接矩阵都不需要构造。
由于每次操作之后的结果必须都是素数,所以可以认为与当前搜索到的素数字符串仅相差一位的所有素数字符串都是“邻接于当前结点的结点”,也就是层序遍历中的“下一层”。
生成 0 - 9999 的素数可以使用素数筛算法(建议背下来),并且由于所有测试用例使用的素数集合都是相同的,所以可以使用打表的方法将这些素数提前生成并保存起来。为了节约时间,这里使用一个 []int
以从大到小的顺序保存所有的素数,并使用一个 map[string]struct{}
保存这些素数的四位字符串,以便在后续 BFS 过程中可以快速找出与当前素数字符串仅相差一位的所有素数字符串。
具体看代码吧。
时间复杂度:O(n),为 BFS 算法的时间复杂度。
空间复杂度:O(n),队列的长度与问题规模(从 initState 到 dstState 的路径长度)成正比。
标签:遍历,萌新,题解,复杂度,算法,Golang,素数,数组,长度 From: https://www.cnblogs.com/gongxianjin/p/17178306.html