📅  最后修改于: 2023-12-03 15:10:36.851000             🧑  作者: Mango
给定一个整数数组和一个整数K,找到一个最小的连续子数组,使得该子数组中元素的二进制表示形式中1的个数至少为K。
输入:nums=[3, 1, 5, 2, 4, 9, 10], K=5
输出:[5, 2, 4]
该问题可以使用双指针算法解决。
时间复杂度:O(nlogn),其中n为数组长度。每次计算1的个数需要O(logn)的时间,最多对每个元素都进行一次计算,因此总时间复杂度为O(nlogn)。
def count_ones(n):
count = 0
while n > 0:
count += n % 2
n //= 2
return count
def min_subarray(nums, k):
left, right = 0, 0
num_ones = count_ones(nums[0])
min_len = float('inf')
min_sub = []
while right < len(nums):
if num_ones < k:
right += 1
if right < len(nums):
num_ones += count_ones(nums[right])
else:
if right - left + 1 < min_len:
min_len = right - left + 1
min_sub = nums[left:right+1]
num_ones -= count_ones(nums[left])
left += 1
return min_sub
以上是Python实现的代码,count_ones函数用于计算一个数字的二进制中1的个数,min_subarray函数用于寻找最小子数组。