1. Tema
Lograr el acceso a la siguiente permutación función, el algoritmo requiere una secuencia numérica dada reordenados dispuesto junto mayor en orden lexicográfico.
Si la siguiente disposición más grande no existe, el número más pequeño de alineación reordenado (es decir, orden ascendente).
Debe colocar la edición , lo que permite un espacio adicional única constante.
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
Fuente: estancia botón (LeetCode)
enlace: https: //leetcode-cn.com/problems/next-permutation
con derechos de autor por deducción de todas las redes. reimpresión comercial póngase en contacto con la reimpresión autorizada oficial, no comercial por favor indique la fuente.
2. Resolución de Problemas
2.1 next_permutation
bool prev_permutation (BidirectionalIterator first, BidirectionalIterator last);
没有下一个更小或者更大的,返回的是false
class Solution {
public:
void nextPermutation(vector<int>& nums) {
next_permutation(nums.begin(),nums.end());
}
};
4 ms 6,8 MB
2. En la parte de atrás para encontrar el primer punto de entrega
- Me parece que el punto de entrega
- Hacia atrás para encontrar el punto i es mayor que el número mínimo, el intercambio
- Por último, la parte posterior del número i en orden ascendente (invertida lata)
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if(nums.size() <= 1)
return;
int i = nums.size()-2, j, n = nums.size();
while(i >= 0 && nums[i] >= nums[i+1])
i--;
if(i>=0)
{
j = i+1;
while(j < n && nums[i] < nums[j])
j++;
swap(nums[i], nums[j-1]);
}
reverse(nums,i+1,n-1);
}
inline void reverse(vector<int>& a, int l, int r)
{
while(l < r)
swap(a[l++],a[r--]);
}
};
0 ms 6,9 MB