[牛 客 网 -Leetcode] #Array Medio siguiente permutación

La siguiente permutación siguiente de matriz completa

Descripción del Título

Función de implementación siguiente permutación (siguiente permutación): reorganiza los números en la permutación a la siguiente permutación más grande en orden lexicográfico. Reorganice los números en la permutación a la siguiente permutación más grande en orden lexicográfico.
Si no existe tal arreglo, colóquelo como el arreglo menos lexicográfico (orden ascendente).
Se necesita un algoritmo in situ para resolver este problema. No puede solicitar espacio de memoria adicional.
Las siguientes muestras de grupos orgánicos, la izquierda son los datos de entrada , y la derecha es Es la respuesta de salida
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

Implementar la siguiente permutación, que reordena los números en la lex
icográficamente la siguiente permutación mayor de números.
Si tal arreglo no es posible, debe reorganizarlo en el orden más bajo posible (es decir, clasificado en orden ascendente).

El reemplazo debe estar en su lugar, no asigne memoria adicional.

Aquí hay unos ejemplos. Las entradas están en la columna de la izquierda y sus salidas correspondientes están en la columna de la derecha.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

Ideas para resolver problemas

  • Idea 1 : use la función next_permutation debajo del archivo de encabezado del algoritmo para reorganizar la secuencia en la siguiente permutación completa.
  • Tenga en cuenta que debe agregar un juicio if. La función next_permutation devolverá falso cuando haya alcanzado la última permutación completa . En este momento, el título requiere que el arreglo sea el arreglo lexicográfico más pequeño, así que ordene por ordenamiento
class Solution {
    
    
public:
    void nextPermutation(vector<int> &num) {
    
    
        if(num.size() == 0) return ;
        //如果存在下一个全排列,则返回true,否则返回false
        if(next_permutation(num.begin(), num.end())) {
    
    
            
        } else {
    
    
            sort(num.begin(), num.end());
        }
    }
};
  • Idea 2 : Encuentra de atrás hacia adelanteOrden ascendenteEl subíndice del último punto, intercambia el elemento antes del punto y el primero después de él.mas que elEl número de este elemento y luego ordenar las siguientes partes en orden ascendente
    • Por ejemplo: 1 2 3 7 6 5 1
    • Encuentre el índice del último punto en orden ascendente de atrás hacia adelante
    • Si no existe tal punto, prueba que toda la matriz está disminuyendo y ha alcanzado la mayor permutación completa, por lo que puede revertir directamente toda la matriz.
    • Si existe un punto como el 7 en el ejemplo anterior, busque el primer número mayor que 3 de atrás hacia adelante. En este ejemplo, es 5
    • Cambie las posiciones de 5 y 3 y organice la siguiente parte de la matriz en orden ascendente para obtener el resultado.
class Solution {
    
    
public:
    void nextPermutation(vector<int> &num) {
    
    
        int n = num.size();
        if(n <= 1) return ;
        //标记从后往前递增排序最后一个点的下标
        int index(n - 1);
        //跳出循环说明是num[index] > num[index - 1],即严格递增
        while(index > 0 && num[index] <= num[index - 1]) index --;
        
        if(index == 0) {
    
      //如果不存在这样的点
            reverse(num.begin(), num.end());
        } else {
    
         //如果存在这样的点
            //标记第一个大于这个点前一个元素的数
            int k(n - 1);
            //跳出循环说明是num[k] > num[index - 1],即严格大于
            while(num[k] <= num[index - 1]) k --;
            swap(num[k], num[index - 1]);
            sort(num.begin() + index, num.end());
        }
    }
};

Supongo que te gusta

Origin blog.csdn.net/cys975900334/article/details/106565004
Recomendado
Clasificación