3344. 最大尺寸数组 🔒
题目描述
给定一个正整数 s
,令 A
为一个 n × n × n
的三维数组,其中每个元素 A[i][j][k]
定义为:
A[i][j][k] = i * (j OR k)
,其中0 <= i, j, k < n
。
返回使数组 A
中所有元素的和不超过 s
的 最大的 n
。
示例 1:
输入:s = 10
输出:2
解释:
n = 2
时数组A
的元素:A[0][0][0] = 0 * (0 OR 0) = 0
A[0][0][1] = 0 * (0 OR 1) = 0
A[0][1][0] = 0 * (1 OR 0) = 0
A[0][1][1] = 0 * (1 OR 1) = 0
A[1][0][0] = 1 * (0 OR 0) = 0
A[1][0][1] = 1 * (0 OR 1) = 1
A[1][1][0] = 1 * (1 OR 0) = 1
A[1][1][1] = 1 * (1 OR 1) = 1
- 数组
A
中元素的总和为 3,没有超过 10,所以n
的最大值为 2。
示例 2:
输入:s = 0
输出:1
解释:
n = 1
时数组A
的元素:A[0][0][0] = 0 * (0 OR 0) = 0
- 数组
A
中元素的总和为 0,没有超过 0,所以n
的最大值为 1。
提示:
0 <= s <= 1015
解法
方法一:预处理 + 二分查找
我们可以粗略估算出 $n$ 的最大值,对于 $j \lor k$,结果的和大致为 $n^2 (n - 1) / 2$,再与 $i \in [0, n)$ 的每个 $i$ 相乘,结果约等于 $(n-1)^5 / 4$,要使得 $(n - 1)^5 / 4 \leq s$,那么 $n \leq 1320$。
因此,我们不妨预处理出 $f[n] = \sum_{i=0}^{n-1} \sum_{j=0}^{i} (i \lor j)$,然后使用二分查找找到最大的 $n$,使得 $f[n-1] \cdot (n-1) \cdot n / 2 \leq s$。
时间复杂度方面,预处理的时间复杂度为 $O(n^2)$,二分查找的时间复杂度为 $O(\log n)$,因此总时间复杂度为 $O(n^2 + \log n)$。空间复杂度为 $O(n)$。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|