LeetCode - Next Permutation | Darren's Blog



Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The replacement must be in-place, do not allocate extra memory

In order to find the next permutation of s , we need to (1) identify such index i as large as possible, (2) swap the digit at index i with the smallest larger value behind it, and (3) rearrange the digits after it in non-descending order. Because of (2), (1) can be achieved by identifying the first increasing adjacent pair in the reverse order, where i is the the index of the first digit. Otherwise, there would be no value greater the digit at index i . And after (2), the digits after index i must be in non-increasing order (prove this yourself). What is left is to reverse them.

public void nextPermutation(int[] num) {
        int n = num.length;
        int a;
        // Find the first increasing adjacent pair in the reverse order;
        // a is the index of the first number of the pair
        for (a = n-2; a >= 0; a--)
            if (num[a] < num[a+1])
                break;
        // The array is in non-increasing order;
        // already the maximum, goes to the smallest
        if (a < 0) {
            reverse(num, 0);
            return;
        }
        // min is the index of the smallest number behind num[a]
        // that are larger than num[a]
        int min = a + 1;
        for (int i = a+2; i < n; i++) {
            if (num[i] <= num[a])
                break;
            if (num[i] <= num[min])
                min = i;
        }
        // Swap num[a] and num[min]
        int temp = num[a];
        num[a] = num[min];
        num[min] = temp;
        // Reverse num[a+1..]
        reverse(num, a+1);
    }
 

Read full article from LeetCode - Next Permutation | Darren's Blog

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts