[
accumulate
greedy
sliding window
]
Leetcode 1703. Minimum Adjacent Swaps for K Consecutive Ones
Problem statement
https://leetcode.com/problems/minimum-adjacent-swaps-for-k-consecutive-ones/submissions/
Solution
The idea is the following: let us look at all places where we have 1. Then we need to find the window of size k, such that sum between elements in this group and its median is the smallest. For one window we can check it in `O(1)
Complexity
It is O(n) for time and space.
Code
class Solution:
def minMoves(self, A, k):
A = [i for i, a in enumerate(A) if a]
ans = float("inf")
acc = [0] + list(accumulate(A))
for i in range(len(A) - k + 1):
ans = min(ans, acc[i + k] - acc[k//2 + i] - acc[(k + 1)//2 + i] + acc[i])
return ans - (k//2) * ((k + 1)//2)