Prison Cells After N Days
题目链接
https://leetcode.com/problems/prison-cells-after-n-days/
题意
给一个仅包含0和1的长度为8的数组(排成一行),数组进行一次变换的定义如下:
- 如果一个元素相邻的元素都为1或都为0,这个元素下一步会变成1
- 否则,元素变成0
(最首元素和最末元素始终没有两个相邻元素所以会变成0)
求出数组经过$N(1 \leq N \leq 10^{9})$次变换后的值
题目类型
智力
题目分析
咋一看N很大有点吓人,但细细一想数组总的可能情况也只有 $ 2^{8} = 256 $种,而且数组是满足循环性质的,所以数组一定会跑不到N次就出现循环,问题就变得简单了。
利用二进制记录数组状态,一旦数组重复了以前出现的样子,就不必再计算,把 剩下的步数 除以 循环的长度 取模值,继续步进该数值的步数即是循环N次后的答案。
时间复杂度
$O(256*8)$
源代码
1 | class Solution { |
Check Completeness of a Binary Tree
题目链接
https://leetcode.com/problems/check-completeness-of-a-binary-tree/
题意
给出一棵树判断其是否属于完全二叉树得到true or false,关于完全二叉树的定义: complete binary tree
完全二叉树中除最后一层外均有节点填满,且最后一层的节点全部靠左(还是看wiki吧不知道怎么说)
树的节点数在1到100间
题目类型
树
题目分析
我的办法是首先找到每个节点的深度得到最大深度maxdep,然后统计深度少于maxdep的节点数,要满足等于$2^{maxdep - 1} - 1$
随后把倒数第二层的所有节点的左右儿子(包括NULL)都放入一个数组,判断数组是否是 左边全是not NULL,右边全是NULL,换句话说如果第一次出现NULL了以后如果后面还有not NULL的节点则不是完全二叉树
应该有比我更好的办法
时间复杂度
$O(N)$
源代码
1 | class Solution { |
Regions Cut By Slashes
题目链接
https://leetcode.com/problems/regions-cut-by-slashes/
题意
由 1 x 1 的方格中组成 N x N 的网格grid,每个 1 x 1 的网格中包含 /,\或空格,这些字符会将方格划分成一些区域。
给出每个网格中的字符,求出划分出的区域的个数。(请注意,反斜杠字符是转义的,因此 \ 用 “\“ 表示)
grid 满足 1 <= grid.length == grid[0].length <= 30
具体含义戳链接看一下样例应该能明白得更透彻
题目类型
图论
并查集
题目分析
很好玩的题目,咋一看很让人摸不着头脑,但是细细一想这道题可以转换成图论中求联通块的数目的问题。
把每个 1 x 1 的小方格分为 左边 和 右边 两个,每次连边时只考虑相邻块的左边的块和上面的块:
- 连接上面的块时,首先看自己网格,如果是’/‘用左块去连,如果是’'用右块去连;其次看上面网格,是’'则连左边块,是’/‘则连右边块
- 连接左边的块时,不管左边块是什么,一定是本块的左边块 连 左边网格的右块
- 方格为’ ‘, 把该网格的左块和右块连起来
连边找联通块数目,并查集解决这个问题非常方便,就不多赘述了
时间复杂度
$O(grid.length ^ {2})$
源代码
1 | class Solution { |
Delete Columns to Make Sorted III
题目链接
https://leetcode.com/problems/delete-columns-to-make-sorted-iii/
题意
给出一个由N个相同长度的小写字符串组成的数组A,可以选择其中的某列,把所有字符串的该列的字符都删掉。
例如 A = [“babca”,”bbazb”] 删除集合为 {0, 1, 4}, 最后会剩下 [“bc”,”az”]
求出最小的集合,满足删除后的数组A中的每个字符串都有字典序不降序 (ie. A[0][0] <= A[0][1] <= … <= A[0][A[0].length - 1])
其中:
- 1 <= A.length <= 100
- 1 <= A[i].length <= 100
题目类型
动态规划
题目分析
就是披了层皮的最长上升子序列问题,定义第i列小于等于第j列为:
所有A中的字符串都有 A[k][i] <= A[k][j]
如果满足该条件则有转移方程 f[j] = max { f[i] + 1 }
f[i]的初值为1,求出A中的最长上升子序列长度后 列数 - 长度 即为最终的答案
时间复杂度
$O(A.length \ast {A[i].length ^ {2}})$
源代码
1 | class Solution { |