LeetCode - 31. Next Permutation 下一个排列
题目
解析
可以分为三种情况:
- 一开始就是升序的,此时我们只需要交换最后两个位置,就可以得到下一个排列;
- 一开始就是降序的,我们只需要把整个数组反转就可以得到一个升序的排列,也就是下一个排列;
- 普通的情况的做法就是,从数组的后面往前面开始找,直到找到第一个当前数不比前一个数小的位置,然后再从当前位置开始往后找到第一个比当前数大的位置,交换这个两个位置,然后将这个位置之后的数反转一遍即可;
代码如下:
class Solution {
public void nextPermutation(int[] nums) {
if (nums.length == 0 || nums == null)
return;
int index = nums.length - 1;
for (; index - 1 >= 0 && nums[index - 1] >= nums[index]; index--) ;
index--;
if (index == -1) { //全部降序
reverse(nums, 0, nums.length - 1);
return;
}
int mini = nums.length - 1;
for (int i = nums.length - 1; i > index; i--) {
if (nums[i] > nums[index]) {
mini = i;
break;
}
}
swap(nums, mini, index);
reverse(nums, index + 1, nums.length - 1);
}
public void reverse(int[] arr, int start, int end) {
if (start >= end) return;
for (int i = start; i <= (start + end) / 2; i++) {
swap(arr, i, (start + end - i));
}
}
public void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论