Leetcode31:下一个排列

题目描述

在这里插入图片描述

思路分析

(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;
	}
}

运行结果

在这里插入图片描述

发布了88 篇原创文章 · 获赞 27 · 访问量 5908

猜你喜欢

转载自blog.csdn.net/weixin_43362002/article/details/104249907
今日推荐