leetcode解题之31. Next Permutation java 版(下一个排列)

来源:互联网 发布:mysql connector java 编辑:程序博客网 时间:2024/05/22 07:50

31. Next Permutation

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place, do not allocate extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,31,3,2
3,2,11,2,3

1,1,51,5,1

了解了全排序之后,其实就是交换数据,比如说需要交换第i和第j个元素(假设i<j),则交换完之后,第i+1及其之后的元素要进行重排序,使其递增;那么现在的问题就是找到要交换的元素,我所做就是从后往前查找:

(1)比如现在要查倒数第k个元素,则从倒数第一个元素到倒数第k+1个元素进行顺序查找,若找到其中有一个元素的值大于倒数第k个元素的值,则进行交换,并在交换后按照上述方法排序。

(2)若后面元素的值都比倒数第k个值小(或相等),则倒数第k个元素到倒数第一个元素形成一个非严格递减序列,则k--,继续(1);

public void nextPermutation(int[] nums) {if (nums == null || nums.length <= 1)return;// 从后向前找到第一个不满足逆序的元素int i = nums.length - 2;// 注意,这里有=,可以排除含有重复元素的情况while (i >= 0 && nums[i] >= nums[i + 1])i--;if (i >= 0) {// 从右往左找到第一个大于nums[i]的元素// 注意等号// 也就是从i+1开始找到最小的一个比nums[i]大的元素int j = nums.length - 1;while (nums[j] <= nums[i])j--;swap(nums, i, j);}// 如果nums是逆序,则i是-1,和下面逆置一样// System.out.println(i);// 将i之后的元素逆置int k = nums.length - 1;i++;for (; i < k; i++, k--)swap(nums, i, k);}// 交换public void swap(int[] arr, int i, int j) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}

0 0
原创粉丝点击