Skip to main content
Back to problems
#1703
Hard Algorithms

Minimum adjacent swaps for k consecutive ones

Array Greedy Sliding Window Prefix Sum
42.3% acceptance
Feb 25, 2026
743
29
You are given an integer array, nums, and an integer k. nums comprises of only 0's and 1's. In one move, you can choose two adjacent indices and swap their values. Return the minimum number of moves required so that nums has k consecutive 1's.

Solution

Rust
Time O(n)
Space O(n)
LeetCode
solution.rs
impl Solution {
  pub fn min_moves(nums: Vec<i32>, k: i32) -> i32 {
    let k = k as usize;
    let pos: Vec<i64> = nums.iter().enumerate()
      .filter(|&(_, &v)| v == 1)
      .map(|(i, _)| i as i64)
      .collect();
    let m = pos.len();
    let q: Vec<i64> = pos.iter().enumerate().map(|(i, &p)| p - i as i64).collect();
    let mut prefix = vec![0i64; m + 1];
    for i in 0..m {
      prefix[i + 1] = prefix[i] + q[i];
    }
    let mut ans = i64::MAX;
    for i in 0..=(m - k) {
      let mid = i + k / 2;
      let median = q[mid];
      let left_sum = prefix[mid] - prefix[i];
      let left_count = (mid - i) as i64;
      let left_cost = median * left_count - left_sum;
      let right_sum = prefix[i + k] - prefix[mid + 1];
      let right_count = (i + k - mid - 1) as i64;
      let right_cost = right_sum - median * right_count;
      ans = ans.min(left_cost + right_cost);
    }
    ans as i32
  }
}