1. 程式人生 > >leetcode 下一個排列

leetcode 下一個排列

一,題目描述:

實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。

如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。

必須原地修改,只允許使用額外常數空間。

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

二,解題思路: 

參考思路:網上看來一個示例,覺得挺好的,也沒必要另外找一個了。

6 5 4 8 7 5 1
一開始沒看對方的後面介紹,就自己在想這個排列的下一個排列是怎樣的。

首先肯定從後面開始看,1和5調換了沒有用。

7、5和1調換了也沒有效果,因此而發現了8、7、5、1是遞減的。

如果想要找到下一個排列,找到遞增的位置是關鍵。

因為在這裡才可以使其增長得更大。

於是找到了4,顯而易見4過了是5而不是8或者7更不是1。

因此就需要找出比4大但在這些大數裡面最小的值,並將其兩者調換。

那麼整個排列就成了:6 5 5 8 7 4 1

然而最後一步將後面的8 7 4 1做一個遞增。

三,C++程式碼: 

class Solution {
public:
	void nextPermutation(vector<int> &num) {
		int index = num.size() - 1;
		while (num[index - 1] >= num[index]){ // 逆序則繼續
			index--;
		}

		if (index == 0){ // 整個陣列都是逆序的
			sort(num.begin(), num.end());
			return;
		}

		// 找到第一個大於,此時4的索引是index-1
		for (int i = num.size() - 1; i >= index; i--){
			if (num[i] > num[index - 1]){
				swap(num[i], num[index - 1]);
				break;
			}
		}

		sort(num.begin() + index, num.end()); // 再將後面的數從小到大排序
		return;

	}
};