334二进制尾零子数组问题
题目描述
要求在一个由正整数组成的数组中找到一个最短的连续子数组,使得该子数组中所有元素的乘积在二进制表示中至少有 k
个连续的 0
,即乘积是 2^k
的倍数。如果不存在这样的子数组,则返回 -1
。
解题思路
因子 2 的计数:
- 乘积为
2^k
的倍数,等价于乘积中包含至少k
个因子 2。
- 乘积为
滑动窗口:
- 使用双指针
l
和r
来维护一个滑动窗口。l
表示窗口的左端,r
表示窗口的右端。 - 遍历数组,逐步扩大右端
r
,将当前元素的因子 2 数量加到cnt2
。 - 当
cnt2
达到或超过k
时,尝试缩小左端l
,以找到最短满足条件的子数组长度。每次缩小时,减去左端元素的因子 2 数量,并移动左指针。
- 使用双指针
代码实现
1 |
|
复杂度分析
- 时间复杂度:
O(n)
,其中n
是数组的长度。每个元素最多被遍历两次(一次作为右端,一次作为左端)。 - 空间复杂度:
O(1)
,只使用了常数级别的额外空间。
334二进制尾零子数组问题
https://kongshuilinhua.github.io/2025/01/21/334二进制尾零子数组问题/