难度:中等
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须** 原地 **修改,只允许使用额外常数空间。
示例 1:
输入:nums = [1,2,3] 输出:[1,3,2]
示例 2:
输入:nums = [3,2,1] 输出:[1,2,3]
示例 3:
输入:nums = [1,1,5] 输出:[1,5,1]
示例 4:
输入:nums = [1] 输出:[1]
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100
解答:
class Solution { //两遍扫描 //时间复杂度O(N),空间复杂度O(1) public void nextPermutation(int[] nums) { int i = nums.length - 2; while(i >= 0 && nums[i] >= nums[i + 1]){ i--; } if(i >= 0){ int j = nums.length - 1; while(j >= 0 && nums[i] >= nums[j]){ j--; } swap(nums, i, j); } reverse(nums, i + 1, nums.length - 1); } public void swap(int[] nums, int i, int j){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } public void reverse(int[] nums, int left, int right){ while(left < right){ swap(nums, left, right); left++; right--; } } }
参考自:
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/next-permutation/solution/xia-yi-ge-pai-lie-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。