做企业门户网站做微商有哪些网站可以免费宣传
题目描述:
给你一个 非负 整数数组 nums 和一个整数 k 。
如果一个数组中所有元素的按位或运算 OR 的值 至少 为 k ,那么我们称这个数组是 特别的 。
请你返回 nums 中 最短特别非空 子数组的长度,如果特别子数组不存在,那么返回 -1 。
代码思路:
- 初始化变量: 
length:数组nums的长度。MIN:用于记录最短子数组的长度,初始值设为length + 1(一个不可能达到的长度,用于后续判断是否存在符合条件的子数组)。l、r:分别表示当前考虑的子数组的左右边界(左闭右闭)。ans:用于存储当前右边界r及其左侧所有元素的按位或结果。
 - 遍历数组: 
- 使用 
while循环遍历数组,r表示当前考察的右边界。 - 在每次循环中,更新 
ans为从l到r的所有元素的按位或结果。 - 如果 
ans >= k,则尝试从右向左找到一个最短的子数组,使得其按位或结果不小于k。 
 - 使用 
 - 内部循环: 
- 从 
r到l-1向左遍历,尝试找到一个最短的满足条件的子数组。 - 使用 
temp和pre变量来记录当前和上一个位置的按位或结果。 - 如果找到一个满足条件的子数组,更新 
MIN、l和ans。 
 - 从 
 - 结果判断: 
- 如果 
MIN仍然是length + 1,说明没有找到符合条件的子数组,返回-1。 - 否则,返回 
MIN。 
 - 如果 
 
代码实现:
class Solution:def minimumSubarrayLength(self, nums: List[int], k: int) -> int:length = len(nums)MIN = length + 1l = r = ans = 0while(r < length):ans = ans | nums[r]if ans >= k:temp = pre = 0for i in range(r, l-1, -1):pre = temptemp = temp | nums[i]if temp >= k:MIN = min(MIN, r-i+1)l = i + 1ans = prebreakr += 1if MIN == length + 1:return -1return MIN 
