1252. 奇数值单元格的数目
考点
- 状态压缩
- 排列组合
题解
同下
思路
已知二维数组M
有m
行,n
列;indices
数组有l
个元素,且每个元素都是长度为2的一维数组
比如某元素值为[0,1]
,代表二维数组中行序号为0的单元格先加一、列序号为1的单元格再加一
正常的暴力方式如下:
开辟
m * n
大小的二维数组空间遍历
indices
数组每个元素的同时,每次分别按行、按列地对二维数组进行批量修改时间复杂度高达\(O\left( l\cdot \left( m+n \right) \right)\)
遍历二维数组的所有单元格,判断有多少个奇数
时间复杂度\(O\left( m\cdot n \right)\)
组合拳下来,时间复杂度高达\(O\left( l\cdot \left( m+n \right) +\left( m\cdot n \right) \right)\),空间复杂度高达\(O\left( m\cdot n \right)\)
空间优化
由于每次都是对某行或某列的所有单元格进行批量加1,可以做如下优化:
设置一个长度为
m
的rows
数组,下标映射为二维数组M
的行序号,值映射为二维数组对应行的增量设置一个长度为
n
的cols
数组,下标映射为二维数组M
的列序号,值映射为二维数组对应列的增量
那么有: \[ M\left[ i \right] \left[ j \right] =rows\left[ i \right] +cols\left[ j \right] \]
1 | class Solution { |
时间复杂度:\(O\left( l+m\cdot n \right)\)
空间复杂度:\(O\left( m+n \right)\)
计数优化 & 集合运算
根据数学性质,奇数 = 奇数 + 偶数
假设有
rows = {1,1}
,cols = {0,2,0}
从两个集合中各取任意一个元素,都可求和为奇数;可行的组合数为
2 * 3 = 6
意味着整个二维数组都是奇数,共有6个奇数
假设有
rows = {1,1,0}
,cols = {1,0,1}
rows
取{1,1}
时,cols
取{0}
才可为奇数,此时可行的组合数为2 * 1 = 2
rows
取{0}
时,cols
取{1,1}
才可为奇数,此时可行的组合数为1 * 2 = 2
意味着整个二维数组中,共有
2 + 2 = 4
个奇数
1 | class Solution { |
时间复杂度:\(O\left( l+m+n \right)\)
空间复杂度:\(O\left( m+n \right)\)
位运算 & 状态压缩 & 集合运算
题目限定了m
与n
均不超过50,使用两个long
类型的变量来替代rows
与cols
数组
用比特位1代表增量为奇数,用比特位0代表增量为偶数
各统计两个变量的1个数
,即各自拥有的奇数个数,再做上述的集合运算即可
bitCount
实现请参见191. 位1的个数
,不再赘述
1 | class Solution { |
时间复杂度:\(O\left( l+\log C
\right)\),这里\(C\)等于long
的位数64
空间复杂度:\(O\left( 1 \right)\)