📅  最后修改于: 2023-12-03 15:37:07.686000             🧑  作者: Mango
给定一个长度为 n 的数组 nums ,你需要找到一个在满足以下条件下的连续子数组反转的最小操作次数:
暴力解法:
时间复杂度为 O(n^3),会超时。
更好的解法:
时间复杂度 O(n)。
def minOperations(nums: List[int]) -> int:
n = len(nums)
evenCount = (n + 1) // 2
oddCount = n // 2
evenPrefixSum = [0] * (n + 1)
for i in range(n):
evenPrefixSum[i + 1] = evenPrefixSum[i] + (nums[i] % 2 == 0)
ans = float('inf')
for i in range(n):
if i + evenCount > n:
break
evenSum = evenPrefixSum[i + evenCount] - evenPrefixSum[i]
reverseEven = evenSum
reverseOdd = oddCount - evenSum
ans = min(ans, min(reverseEven, reverseOdd))
return ans
输入:
nums = [1,2,3,4,5,6]
输出:
2
解释:
将 nums[1: 4] 反转一下,可以得到 [1,4,3,2,5,6],其中偶数位置上的数是 [1,3,5],奇数位置上的数是 [4,2,6],恰好有 3 个偶数和 3 个奇数,偶数位置上元素总数最小,为 2。