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 |
|