# LeetCode 31 Next Permutation（下一个排列）

7683人阅读 评论(1)

## 翻译

1，2，3 → 1，3，2
3，2，1 → 1，2，3
1，1，5 → 1，5，1

## 原文

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,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

## 题意

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

## 分析

6 5 4 8 7 5 1

首先肯定从后面开始看，1和5调换了没有用。

7、5和1调换了也没有效果，因此而发现了8、7、5、1是递减的。

## 代码

class Solution {
public:
void nextPermutation(vector<int>& nums) {
int index = nums.size() - 1;
while(nums[index] < nums[index-1]) {
--index;
}
if(index == 0) {
sort(nums.begin(), nums.end());
return ;
}

int second = INT_MAX, secondIndex = INT_MAX;
for(int i = nums.size() - 1; i >= index - 1; -- i) {
if(nums[i] > nums[index - 1]) {
if(nums[i] < second) {
second = nums[i];
secondIndex = i;
}
}
}
int temp = nums[index - 1];
nums[index - 1] = nums[secondIndex];
nums[secondIndex] = temp;

sort(nums.begin()+index, nums.end());
}
}

while(nums[index] <= nums[index-1]) {
--index;
}

while(index > 0){
if(num[index] > num[index - 1]){
break;
}
index--;
}
int exchangeIndex;
for(int i = num.size()-1; i >= index; i--){
if(num[i] > num[index-1]){
exchangeIndex = i;
break;
}
}
swap(num[index-1],num[exchangeIndex]);

while循环这一部分我的更简单，不过其他的就要复杂些了，swap都没想到……

## 扩展

C Plus Plus

void nextPermutation(vector<int> &num) {
next_permutation( num.begin(), num.end() );
}  

Java

updated at 2016/09/04
    public void nextPermutation(int[] nums) {
int index = nums.length - 1;
while (index > 0 && nums[index] <= nums[index - 1]) {
--index;
}
if (index == 0) {
Arrays.sort(nums);
return;
}
int second = Integer.MAX_VALUE, secondIndex = Integer.MAX_VALUE;
for (int i = nums.length - 1; i >= index - 1; --i) {
if (nums[i] > nums[index - 1] && nums[i] < second) {
second = nums[i];
secondIndex = i;
}
}
int tmp = nums[index - 1];
nums[index - 1] = nums[secondIndex];
nums[secondIndex] = tmp;
Arrays.sort(nums, index, nums.length);
}

个人资料
等级：
访问量： 163万+
积分： 2万+
排名： 326
勿忘初心
博客专栏
 SICP练习 文章：151篇 阅读：281053 Scheme归纳 文章：13篇 阅读：68249 OpenCV归纳 文章：5篇 阅读：21201 欧拉工程 文章：0篇 阅读：0 Windows App开发 文章：37篇 阅读：141163 算法 文章：9篇 阅读：77966 LeetCode 文章：27篇 阅读：90352 Android 开发 文章：6篇 阅读：19814 UWP通用应用开发 文章：6篇 阅读：19001
最新评论