本文共 1379 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要找到最少的翻转次数,使得数组中没有值为0的元素。每次翻转操作选择一个长度为K的连续子数组,并将子数组中的每个0翻转为1,1翻转为0。
我们可以使用滑动窗口技术来解决这个问题。滑动窗口的核心思想是维护一个队列,记录当前窗口内需要翻转的位置。每次处理到一个位置时,检查队列中的元素是否在当前窗口中,如果不在,则移除这些元素。然后,根据队列的大小来判断当前位置是否需要翻转。如果队列的大小为奇数,说明需要翻转当前位置。
具体步骤如下:
import sysfrom collections import dequeclass Solution: def minKBitFlips(self, A: list[int], K: int) -> int: N = len(A) if K == 0: return 0 que = deque() res = 0 for i in range(N): # 移除已出队的位置 while que and que[0] < i - K + 1: que.popleft() # 判断是否需要翻转 if len(que) % 2 == 1: # 说明需要翻转当前位置i if i + K > N: return -1 que.append(i) res += 1 return resif __name__ == "__main__": A = [0,1,0] K = 1 print(Solution().minKBitFlips(A, K)) # 输出:2 A = [1,1,0] K = 2 print(Solution().minKBitFlips(A, K)) # 输出:-1 A = [0,0,0,1,0,1,1,0] K = 3 print(Solution().minKBitFlips(A, K)) # 输出:3
这种方法通过滑动窗口技术高效地解决问题,时间复杂度为O(N),适用于较大的数组。
转载地址:http://miog.baihongyu.com/