我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/next-permutation/description/
题目描述:
知识点:数组
思路:理解题意,寻找手动算法的原理
(1)从数组最后一个元素开始扫描,寻找到nums[i] > nums[i - 1]的第一个i值。
(2)如果得到i值大于等于1,说明数组存在下一个排列。
a.我们还是从数组最后一个元素开始扫描,寻找到num[j] > nums[i - 1]的第一个j值。由于nums[i] > nums[i - 1],所以我们的j值一定是大于等于i的。
b.交换索引为i - 1和索引为j的元素的值。
c.此时索引i及之后的排列时一个降序排列,将其变成升序排列即可。
为什么说此时索引i及之后的排列是一个降序排列呢?
对于原来的数组,由于我们是从数组最后一个元素开始扫描寻找到的nums[i] > nums[i - 1]的第一个i值,我们原数组中i之后的排列一定是一个降序排列。那么我们只需要看交换之后是否依然是一个降序排列呢?
而寻找索引j,我们还是从数组最后一个元素开始扫描,寻找到num[j] > nums[i - 1]的第一个j值。对于索引j之后的值,一定是小于等于nums[i - 1]的。对于而对于索引i到j - 1这部分元素,一定是大于等于num[j]的,自然一定大于nums[i - 1],那么,交换之后,原数组中i之后的排列一定依然是一个降序排列。
(3)如果得到的i值小于1,说明数组不存在下一个排列,倒序输出数组即得升序排列。
public class Solution {
public void nextPermutation(int[] nums) {
int n = nums.length;
int i = n - 1;
for(; i >= 1; i--) {
if(nums[i] > nums[i - 1]) {
break;
}
}
if(i >= 1) {
int j = n - 1;
for(; j >= i; j--) {
if(nums[j] > nums[i - 1]) {
break;
}
}
swap(i - 1, j, nums);
reverse(nums, i);
}else {
reverse(nums, 0);
}
}
private void reverse(int[] nums, int index) {
int i = index;
int j = nums.length - 1;
while(i < j) {
swap(i, j, nums);
i++;
j--;
}
}
private void swap(int i, int j, int[] nums) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
LeetCode解题报告: