LeetCode 31 下一个排列
LeetCode31 下一个排列
题目描述
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间
样例
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
算法分析

时间复杂度\(O(n+n+n)=>O(n)\)
Java代码
class Solution {
static void swap(int[] arr, int l, int r){
int t = arr[l];
arr[l] = arr[r];
arr[r] = t;
}
static void reverse(int[] arr, int l, int r){
while(l < r) swap(arr, l++, r--);
}
public void nextPermutation(int[] nums) {
int n = nums.length;
//找到升序
int k = n - 2;
while(k >= 0 && nums[k] >= nums[k+1]) k--;
if(k==-1){
//说明是全降序 5 4 3 2 1
//最大了
reverse(nums, 0, n-1);
}else{
//找到,[k+1, n-1] 中 大于 nums[k], 且最接近(就大一点点)
//用二分
int l = k+1;
int r = n-1;
while(l < r){
int mid = l + r + 1 >> 1;
if(nums[mid] > nums[k]) l = mid;
else r = mid - 1;
}
//交换
swap(nums, k, l);
reverse(nums, k+1, n-1);
}
}
}

浙公网安备 33010602011771号