Skip to main content

Moving Stones Until Consecutive II - Solution & Explanation

MediumArrayMathTwo PointersSorting18 min readAsked at: Meta
Practice this problem

Problem Statement

There are some stones in different positions on the X-axis. You are given an integer array stones, the positions of the stones.

Call a stone an endpoint stone if it has the smallest or largest position. In one move, you pick up an endpoint stone and move it to an unoccupied position so that it is no longer an endpoint stone.

  • In particular, if the stones are at say, stones = [1,2,5], you cannot move the endpoint stone at position 5, since moving it to any position (such as 0, or 3) will still keep that stone as an endpoint stone.

The game ends when you cannot make any more moves (i.e., the stones are in three consecutive positions).

Return an integer array answer of length 2 where:

  • answer[0] is the minimum number of moves you can play, and
  • answer[1] is the maximum number of moves you can play.

 

Example 1:

Input: stones = [7,4,9]
Output: [1,2]
Explanation: We can move 4 -> 8 for one move to finish the game.
Or, we can move 9 -> 5, 4 -> 6 for two moves to finish the game.

Example 2:

Input: stones = [6,5,4,3,10]
Output: [2,3]
Explanation: We can move 3 -> 8 then 10 -> 7 to finish the game.
Or, we can move 3 -> 7, 4 -> 8, 5 -> 9 to finish the game.
Notice we cannot move 10 -> 2 to finish the game, because that would be an illegal move.

 

Constraints:

  • 3 <= stones.length <= 104
  • 1 <= stones[i] <= 109
  • All the values of stones are unique.

Approach Overview

Problem Overview: You are given the positions of stones on a number line. In one move, you can relocate an endpoint stone to any empty position so the stone is no longer an endpoint. The task is to compute the minimum and maximum number of moves required to make all stones occupy consecutive positions.

Approach 1: Brute Force with Optimization (Time: O(n2), Space: O(1))

Start by sorting the array so stone positions are in increasing order. For every possible consecutive segment of length n, count how many stones already fall inside that segment. The remaining stones must be moved. You simulate different windows of size n across the number line and compute the number of stones outside each window. This approach works because the final configuration must be a block of n consecutive integers. Sorting enables efficient range checks, but scanning every candidate window still leads to quadratic behavior in the worst case.

Approach 2: Sliding Window and Greedy (Time: O(n log n), Space: O(1))

Sort the stones first. The maximum moves come from greedily filling gaps between stones while keeping one endpoint fixed. Specifically, compute the total empty spaces between the first and last stones and subtract the larger boundary gap to determine the worst-case moves. For the minimum moves, use a sliding window over the sorted array to find the largest group of stones that already fits inside a window of size n. Two pointers expand and shrink the window while checking stones[right] - stones[left] + 1. The number of stones outside this window represents the moves needed. One edge case occurs when n-1 stones already fit in a window but require two moves due to endpoint constraints. This technique relies on properties of sorted positions and works naturally with two pointers and sorting over an array.

Recommended for interviews: The sliding window and greedy strategy is the expected solution. Interviewers want to see you recognize that consecutive placement forms a window of size n and that sorting enables efficient pointer movement. Mentioning the brute force idea first shows problem exploration, but implementing the optimized sliding window demonstrates strong algorithmic reasoning.

Approach 1: Sliding Window and Greedy Approach

An efficient approach to solve the problem combines a sliding window technique with some greedy insights. First, we sort the stone positions. The main observation is that the smallest window covering the stones consecutively determines the minimum moves required. For the maximum moves, the difference between the maximum and minimum stones minus the number of stones gives the maximum gap, in which we can perform the moves.

The C solution sorts the stones and uses a sliding window to check the number of stones in a consecutive subsequence. It updates the minimum moves with the extra moves needed to achieve a full sequence. It also calculates the maximum moves considering the largest gap at the ends.

Code

C

C++

Java

Python

C#

JavaScript

Complexity

Time Complexity: O(n log n) due to the sorting step. Space Complexity: O(1) for using constant extra space apart from input and output.

Try this approach in the editor →

Approach 2: Brute Force with Optimization

This approach tries every possible position for an endpoint stone to minimize or maximize the moves. Although not as efficient as the previous optimized slide window approach, it showcases one straightforward yet computationally intensive method. It tries to place endpoint stones in every potential position keeping them non-endpoints in mind.

In C, this version calculates gaps explicitly, and imposes constraints to limit endpoint becoming one in every choice of moves. Then performs sliding window evaluation for min moves.

Code

C

C++

Java

Python

C#

JavaScript

Complexity

Time Complexity: O(n^2) in the worst case due to the nested loops probing. Space Complexity: O(1).

Try this approach in the editor →

Approach 3: Default Approach

Code

Python

Java

C++

Go

TypeScript

Try this approach in the editor →

Complexity Comparison

ApproachComplexity
Sliding Window and Greedy Approach

Time Complexity: O(n log n) due to the sorting step. Space Complexity: O(1) for using constant extra space apart from input and output.

Brute Force with Optimization

Time Complexity: O(n^2) in the worst case due to the nested loops probing. Space Complexity: O(1).

Default Approach—

Detailed Complexity Analysis

ApproachTimeSpaceWhen to Use
Brute Force with OptimizationO(n^2)O(1)Good for understanding the problem by testing every possible consecutive window.
Sliding Window and GreedyO(n log n)O(1)Best practical solution after sorting. Efficiently finds the largest valid window using two pointers.

Video Solution

1040. Moving Stones Until Consecutive II (Leetcode Medium) • Programming Live with Larry • 1,939 views views

Watch 9 more video solutions →

Frequently Asked Questions

Is Moving Stones Until Consecutive II easy or hard?
Moving Stones Until Consecutive II is rated Medium on LeetCode. The challenge comes from recognizing the sliding window pattern and handling the special edge case for minimum moves. Once the greedy insight is clear, the implementation is relatively short.
Moving Stones Until Consecutive II Python/Java solution
Most implementations follow the same pattern: sort the array, compute maximum moves using gap calculations, and compute minimum moves using a sliding window. This logic translates directly across Python, Java, C++, C, and JavaScript with identical time complexity of O(n log n).
How to solve Moving Stones Until Consecutive II in O(n)?
After sorting, the core logic for the minimum moves runs in O(n) using a sliding window. Two pointers maintain the largest window where stones[right] - stones[left] + 1 <= n. The stones outside this window represent the moves needed, with a special case when n-1 stones fit but require two moves due to endpoint rules.
What is the best approach for Moving Stones Until Consecutive II?
The optimal solution uses sorting followed by a sliding window with a greedy calculation. Sorting the stones allows a two-pointer window to track the largest group that already fits within a range of size n. The minimum moves come from stones outside this window, while the maximum moves are derived from the boundary gaps. The total complexity is O(n log n) due to sorting.
Is Moving Stones Until Consecutive II asked at Google/Amazon/Meta?
This problem type appears in interviews at large tech companies because it combines greedy reasoning, sorting, and two-pointer techniques. Variants involving intervals, sliding windows, and gap counting are commonly discussed in companies like Google, Amazon, and Meta.
What data structure is used in Moving Stones Until Consecutive II?
The solution primarily uses an array combined with sorting and a two-pointer sliding window. No advanced data structures are required. The algorithm relies on calculating gaps between sorted positions and maintaining a moving window over the array.
What is the time complexity of Moving Stones Until Consecutive II?
The optimal algorithm runs in O(n log n) time because the stone positions must be sorted first. After sorting, a sliding window with two pointers scans the array in linear time O(n). Space complexity remains O(1) since the computation uses only a few variables.

Ready to solve this problem?

Practice Moving Stones Until Consecutive II with our built-in code editor and test cases.

Practice on FleetCode