下一个排列

题目:已知一个排列,按照字典排序的方式查找大于当前排列的下一个排列,若当前排列没有比它更大的排列后,返回这个排列的最小排列(其实就是升序)。

要求:不得申请额外的空间

下面的举例说明下,(左边的是输入的排列,右边的输出的排列)

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

解题感悟:说了半天就是初中学过的排序的,找到一个比当前大的下个排序,要是人去做的话,很简单,换成电脑语言还真的不好想,让我彻夜失眠的,早上又研究了一上午,还是想通了。

原理是:在当前序列中,从尾端往前寻找两个相邻元素,前一个记为num[index-1],后一个记为num[index],并且满足num[index-1]< num[index]。然后再从尾端寻找另一个元素num[swap],如果满足num[index-1]< num[swap],然后num[index-1]与num[swap]对调,并将num[index]之后(包括num[index])的所有元素颠倒排序,即求出下一个序列了

不好想啊,举个例子

1,4,6,5,3,2

从尾部开始找符合关系的第一个相邻数字,目测,只有 4,6,此时index 为2,因为我们记录的是index,和index -1,在从尾部开始找第一个元素大于4的,找到是5,那么swap=3;

交换4 和5,然后将index=2,其实就是6开始(包括6)倒叙,就变成了 1,5,2,3,4,6

是不是这个样子?

一天啊,浪费了

 

public void nextPermutation(int[] num) {
		int index = num.length - 1;

		while (index > 0) { // 寻找第一个相邻元素前一个比后面的元素小的元素索引
			if (num[index] > num[index - 1]) {
				break;
			}
			index--;
		}
		int swap = num.length - 1;
		while (swap > 0&&index>0) { // 寻找第一个比index-1对应值大的数字
			//index >0为了保证倒序排列的,3,2,1,这样的话,index就是0
 			if (num[swap] > num[index - 1]) {
				int temp = num[index - 1];
				num[index - 1] = num[swap];
				num[swap] = temp;
				break;
			}
			swap--;
		}
		for (int i = 0; i < (num.length - index) / 2; i++) {

			int temp = num[index + i];
			num[index + i] = num[num.length - i - 1];
			num[num.length - i - 1] = temp;
		}
		
	}

 

你可能感兴趣的:(下一个排列 java,java 下一个排列)