/**
* e.g. 1 2 3 4
* Step i. From right to left, find the first element at index i which breaks the ascending order,
* if no such i exists, then the array is sorted as ascending order, return the descending (right to left) order
* in this case, the element is 3.
* Step ii. Search from right to left, find the first elem nums[j] which is greater than nums[i], swap nums[i] and nums[j]
* Step iii. Sort the array as descending order from right to left where index starts from i+1 and ends at nums.length-1
*/
public class Solution {
public static void reverseArray(int[] nums, int low, int high) {
int tmp = 0;
while (low < high) {
tmp = nums[low];
nums[low] = nums[high];
nums[high] = tmp;
low++; high--;
}
}
public void nextPermutation(int[] nums) {
// tells if the array is ordered
boolean isOrdered = true;
// find the index i, if no such i, reverse the array and reture
int i = 0;
for (i=nums.length-1; i>0; i--)
if (nums[i-1] < nums[i]) {
i--;
isOrdered = false;
break;
}
if (isOrdered)
reverseArray(nums, 0, nums.length-1);
else {
int j = nums.length-1;
while (j > i) {
if (nums[j] > nums[i])
break;
j--;
}
// swap nums[i] and nums[j]
int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp;
reverseArray(nums, i+1, nums.length-1);
}
}
}
Leetcode 31. Next Permutation
最新推荐文章于 2021-05-21 19:06:52 发布