📅  最后修改于: 2023-12-03 15:40:16.362000             🧑  作者: Mango
给定一个整数数组,找到一个最小的子数组,使得子数组中元素的二进制表示形式中的1的数目至少为K。
先考虑一个数的二进制表示中有多少个1,这个可以通过计算一个数右移一位后与1做与运算的结果来判断最后一位是否为1,如果是1,则表示有一个1,其余位继续右移,直到数变为0为止。
接着考虑如何找到最小的子数组。可以使用双指针,滑动窗口的方法来解决。先用一个指针i指向数组的开头,然后用另一个指针j从i开始遍历数组,计算遍历到的数的二进制表示中的1的个数,当找到第一个满足条件的子数组后,再将i指向子数组的下一个元素,并继续计算新的子数组中的1的个数,直到i或j越界为止,最后得到的就是最小的子数组。
def min_subarray(nums: List[int], k: int) -> int:
n = len(nums)
res = float('inf')
i = j = cnt = 0
while j < n:
cnt += bin(nums[j]).count('1')
while cnt >= k:
res = min(res, j - i + 1)
cnt -= bin(nums[i]).count('1')
i += 1
j += 1
return res if res != float('inf') else -1
时间复杂度为O(nlogn),其中n表示数组的长度,logn表示计算一个数的二进制表示中1的个数的时间复杂度。