题目地址:
https://www.lintcode.com/problem/next-permutation-ii/description
给定一个数组,求其按照字典序从小到大的下一个全排列。如果不存在,则返回字典序最小的全排列。要求空间 O ( 1 ) O(1) O(1)。
和https://blog.csdn.net/qq_46105170/article/details/108480619一模一样做就行。代码如下:
public class Solution {
/**
* @param nums: An array of integers
* @return: nothing
*/
public void nextPermutation(int[] nums) {
// write your code here
if (nums == null || nums.length == 0) {
return;
}
int i = nums.length - 1;
while (i > 0 && nums[i - 1] >= nums[i]) {
i--;
}
if (i == 0) {
reverse(nums, 0, nums.length - 1);
return;
}
int j = binarySearch(nums, i, nums.length - 1, nums[i - 1]);
swap(nums, i - 1, j);
reverse(nums, i, nums.length - 1);
}
private int binarySearch(int[] nums, int l, int r, int target) {
while (l < r) {
int m = l + (r - l + 1 >> 1);
if (nums[m] > target) {
l = m;
} else {
r = m - 1;
}
}
return r;
}
private void reverse(int[] nums, int i, int j) {
while (i < j) {
swap(nums, i, j);
i++;
j--;
}
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。