LeetCode31. 下一個排列
阿新 • • 發佈:2020-09-21
實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
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]); } } '''