题目描述
思路分析
(1)从右到左,找到第一个违反递增趋势的分区数;例如下图的6。
(2)从右到左,找到第一个比分区数大的改变数;例如下图的7。
(3)交换分区数和改变数;例如下图的6和7交换。
(4)颠倒分区数索引的右边所有数字。例如下图的7之后的元素。
动画演示
代码实现
package LeetCode;
import java.util.Arrays;
public class NextPermutation {
public static void main(String[] args) {
int[] arr= {1,2,3,5,4,6};
nextPermutation(arr);
System.out.println(Arrays.toString(arr));
}
public static void nextPermutation(int[] nums) {
int i=nums.length-2;
while (i>=0&&nums[i+1]<=nums[i]) { //从导数第2个数开始找起
i--;
}
if (i>=0) {
int j=nums.length-1;
while (j>=0&&nums[j]<=nums[i]) {
j--;
}
swap(nums,i,j);
}
reverse(nums,i+1);
}
private static void reverse(int[] nums, int start) {
int i=start,j=nums.length-1;
while (i<j) {
swap(nums, i, j);
i++;
j--;
}
}
private static void swap(int[] nums, int i, int j) {
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}