[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/JoshP/ProjectEuler-Java/master/Sol24.java [Back]  [Original]

/*
The following algorithm generates the next permutation lexicographically after a given permutation. 
It changes the given permutation in-place.
Find the largest index k such that a[k] < a[k + 1]. If no such index exists, 
the permutation is the last permutation.
Find the largest index l such that a[k] < a[l]. Since k + 1 is such an index, 
l is well defined and satisfies k < l.
Swap a[k] with a[l].
Reverse the sequence from a[k + 1] up to and including the final element a[n].
*/
import java.util.*;
import java.math.*;

 public class Sol24 extends BaseSolution {
    public void runSolution() {
        int[] initial = new int[]{0,1,2,3,4,5,6,7,8,9};
        int count = 1;
        while (count != 1000000) {
            count++;
            next(initial);    
        }   
        printArray(initial);        
    }

    public void next(int[] a) {
        int k = -1;
        for (int i = a.length - 2; i >= 0; i--) {
            if (a[i] < a[i + 1]) {
                k = i;
                break;                
            }
        }
        if (k == -1) {
            System.out.println("found last");
            return;
        }
        int l = k + 1;
        for (int i = l; i < a.length; i++) {
            if (a[k] < a[i])
                l = i;
        }
        swap(k, l, a);
        for (int i = k + 1, end = ((a.length - k + 1) / 2) + k; i < end; i++) {
            swap(i, a.length - i + k, a);
        }
    }

    public void printArray(int[] a) {
        for (int i : a) {
            System.out.print(i);
        }     
        System.out.println();        
    }

    public void swap(int i, int j, int[] a) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;        
    }
}
 

Web Proxy Viewer  |  New URL  |  Original Page