# 下一个排列

### 题目描述

整数数组的一个 **排列**  就是将其所有成员以序列或线性顺序排列。

* 例如，`arr = [1,2,3]` ，以下这些都可以视作 `arr` 的排列：`[1,2,3]`、`[1,3,2]`、`[3,1,2]`、`[2,3,1]` 。

整数数组的 **下一个排列** 是指其整数的下一个字典序更大的排列。更正式地，如果数组的所有排列根据其字典顺序从小到大排列在一个容器中，那么数组的 **下一个排列** 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列，那么这个数组必须重排为字典序最小的排列（即，其元素按升序排列）。

* 例如，`arr = [1,2,3]` 的下一个排列是 `[1,3,2]` 。
* 类似地，`arr = [2,3,1]` 的下一个排列是 `[3,1,2]` 。
* 而 `arr = [3,2,1]` 的下一个排列是 `[1,2,3]` ，因为 `[3,2,1]` 不存在一个字典序更大的排列。

给你一个整数数组 `nums` ，找出 `nums` 的下一个排列。

必须[ **原地** ](https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95)修改，只允许使用额外常数空间。

&#x20;

**示例 1：**

<pre><code><strong>输入：nums = [1,2,3]
</strong><strong>输出：[1,3,2]
</strong></code></pre>

**示例 2：**

<pre><code><strong>输入：nums = [3,2,1]
</strong><strong>输出：[1,2,3]
</strong></code></pre>

**示例 3：**

<pre><code><strong>输入：nums = [1,1,5]
</strong><strong>输出：[1,5,1]
</strong></code></pre>

&#x20;

**提示：**

* `1 <= nums.length <= 100`
* `0 <= nums[i] <= 100`



### 思路

* 下一个排列为比当前排列大，并且差距最接近。如果是最后一个排列，反转即可。
* 从右往左找到第一对，i\<j && nums\[i]>=\[j]，然后再从右往左找到到比nums\[i]大的第一个数。

```golang
func nextPermutation(nums []int)  {
    i:=len(nums)-2

    for i>=0&&nums[i]>=nums[i+1]{
        i--
    }
    
    if i>=0{
        j:=len(nums)-1
        for j>=0&&nums[j]<=nums[i]{
            j--
        }
        nums[i],nums[j]=nums[j],nums[i]
    }

    l,r:=i+1,len(nums)-1

    for l<r{
        nums[l],nums[r]=nums[r],nums[l]
        l++
        r--

    }

}
```
