📌  相关文章
📜  最小子数组,以使得其元素的二进制表示形式中的1的数目至少为K(1)

📅  最后修改于: 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的个数的时间复杂度。