Shortest path to traverse all the elements of a circular array in increasing order

There are N distinct integers arranged on a circle. The distance between any two adjacent numbers is 1. The task is to travel on this circle starting with the smallest number, then moving to the second smallest, third smallest, and so on until the largest number and print the minimum travel distance.


Input: arr[] = {3, 6, 5, 1, 2, 4}
Output: 8
1 -> 2 (Left to right)
2 -> 3 (Left to right)
3 -> 4 (Right to left)
4 -> 5 (Left to right or right to left)
5 -> 6 (Right to left)

Input: arr[] = {14, 16, 8, 17, 12, 10, 4, 13, 11, 20}
Output: 27

Approach: If we want to travel between two elements with indices i and j, we have two possible paths, one of length |i – j| and the other of length n – |i – j| and we will take the one with the minimum distance.
Initially, we build an array of pairs of (element, index) and we sort it in increasing order of the elements. Then we can take every two consecutive pairs and find the shortest way to travel between these two elements.

Below is the implementation of the above approach:





// Java implementation of the approach
import java.util.*;
class GFG {
    // Function to return the minimum distance
    static int min_distance(int n, int[] arr)
        // Declare a Pair[] array of size n
        Pair[] val = new Pair[n];
        // Store all the (element, index) pairs
        for (int i = 0; i < n; i++)
            val[i] = new Pair(arr[i], i);
        // Sort the pairs in ascending order of the value
        Arrays.sort(val, com);
        int min_dist = 0;
        for (int i = 1; i < n; i++) {
            // Choose the minimum distance path
            // of the two available
                += Math.min(Math.abs(val[i].y - val[i - 1].y),
                            n - Math.abs(val[i].y - val[i - 1].y));
        return min_dist;
    // Comparator to be used in the
    // sorting of pairs based on the values
    static final Comparator<Pair> com = new Comparator<Pair>() {
        public int compare(Pair a, Pair b)
            if (, b.x) != 0)
                return, b.x);
                return, b.y);
    // Class to represent a pair
    static class Pair {
        int x, y;
        Pair(int p, int q)
            x = p;
            y = q;
    // Driver code
    public static void main(String[] args)
        int[] arr = new int[] { 3, 6, 5, 1, 2, 4 };
        int n = arr.length;
        System.out.println(min_distance(n, arr));




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using or mail your article to See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at to report any issue with the above content.