【LeetCode每日一题】[中等]31. 下一个排列

【LeetCode每日一题】[中等]31. 下一个排列

31. 下一个排列

题目来源
算法思想:数组

题目:
在这里插入图片描述
算法思路:link.
在这里插入图片描述

java代码

class Solution {
    
    
    public void nextPermutation(int[] nums) {
    
    
		int n = nums.length;
		int i = n - 1;
		while (i > 0 && nums[i-1] >= nums[i]) {
    
    //从后向前遍历,找第一个下降点i-1
			i--;
		}
		if (i > 0) {
    
    //如果第一个下降点不是0,则需要进行交换
			int j = i;//指向下降点i-1的下一个点,利用[i,n-1]区间是非递增
			while (j < n && nums[i-1] < nums[j]) {
    
    //从前向后遍历,寻找大于下降点的数,这个数是大于下降点数中最小的数
				j++;
			}//j-1是要找的那个数
			swap(nums, i-1, j-1);//交换两个数
		}
		reverse(nums, i);//将交换后的i-1之后的区间进行逆转(该区间是非递增,只要逆转即可以有序)
    }

	private void reverse(int[] nums, int i) {
    
    //逆转一个区间,
		int j = nums.length-1;
		while (i < j) {
    
    
			swap(nums, i, j);
			i++;
			j--;
		}
		
	}

	private void swap(int[] nums, int i, int j) {
    
    //交换数组中的两个数
		int tmp = nums[i];
		nums[i] = nums[j];
		nums[j] = tmp;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39457586/article/details/109596700