1. 程式人生 > 實用技巧 >LeetCode31. 下一個排列

LeetCode31. 下一個排列

31. 下一個排列

實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。

如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。

必須原地修改,只允許使用額外常數空間。

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

題解

    class Solution {
     public void nextPermutation(int[] nums) {
        if (nums == null || nums.length < 2) {
            return;
        }
        int j = nums.length - 1;
        int flagIndex = nums.length - 1;
        int i =0;

        while (j - 1 >= 0 && nums[j - 1] >= nums[j]) {

            j--;
            // System.out.println(j);
            flagIndex = j;

        }

        // System.out.println("25  " + flagIndex);

        // 說明有戲
        if (flagIndex > 0) {
            // int min = nums[flagIndex - 1];
            int bigger = nums[flagIndex];

            // System.out.println(flagIndex);

            int midIndex = flagIndex;
            for (i = flagIndex; i <= nums.length - 1; i++) {
                if (nums[i] > nums[flagIndex - 1] && nums[i] < bigger) {
                    bigger = nums[i];
                    midIndex = i;

                }
            }

            // if (midIndex > 0) {

                swap(nums, midIndex, flagIndex - 1);
                // print(nums);

                i = midIndex;
                
                // 低位排序 有可能 小數插入後,後面有和midIndex相同
                while (i + 1 < nums.length && nums[i] < nums[i + 1]) {
                    swap(nums, i, i + 1);

                    i++;

                // }

            }

        }
        // System.out.println(flagIndex);
        int high = flagIndex;
        int low = nums.length - 1;
        while (high < low) {
            swap(nums, high, low);
            high++;
            low--;
        }

    }

    private void swap(int[] nums, int midIndex, int index) {

        // int temp = nums[index];
        // nums[index] = nums[midIndex];
        // nums[midIndex] = temp;
        // System.out.println(nums[index] + ", " + nums[midIndex]);

        nums[index] = nums[index] ^ nums[midIndex];
        nums[midIndex] = nums[midIndex] ^ nums[index];
        nums[index] = nums[index] ^ nums[midIndex]; 
        // System.out.println(nums[index] + ", " + nums[midIndex]);


    }
    }
'''