3,14 subida secuencia más larga

título

Un trastorno de una matriz de enteros dada, la longitud de la secuencia más larga creciente encontrado.

Ejemplos

输入: [10,9,2,5,3,7,101,18]
输出: 4 
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

Un pensamiento

  • la ( norte 2 ) O (n ^ 2)
  • Longitud del registro del número de secuencia en el extremo de cada una de la más larga sub-secuencia con un aumento en la matriz.
  • Para la posición actual, antes de cada una de una serie de recorrido, cada uno a encontrar su número es menor que, obtener una sub-secuencia de una subida, tomar la más larga a la posición actual como el final de la longitud de la secuencia más larga aumento.

código 1

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        if ( nums.size() == 0 ) return 0;

        int res = 1;
        vector<int> dp( nums.size(), 1 );

        for ( int i = 1; i < nums.size(); ++i ) {
            for ( int j = 0; j < i; ++j ) {
                if ( nums[i] > nums[j] ) {
                    dp[i] = max( dp[i], dp[j] + 1);
                }
            }

            res = max( dp[i], res );
        }

        return res;
    }
};	

Ideas de dos

  • La complejidad de O (NLGN)
  • Mantener un array s. A través de la matriz, la primera matriz de rellenos s primer valor está vacía.
  • A través de la matriz, la matriz es el número de num actual,
    • Si el número es mayor que la cola s num, num en los s.
    • Si s es menor que el número de cola num, simplemente encontrar un número mayor que el primero y en el s num num e intercambio.
  • Este paso se puede realizar búsquedas con los binarios.
  • S es la longitud de la longitud final de la secuencia creciente más larga.

código 2

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        if ( nums.size() < 2 ) return nums.size();

        vector<int> tail; // 以i为结尾的最长子序列。
        tail.reserve( nums.size() );
        tail.push_back( nums[0] );
        int end = 0;

        for ( int i = 1; i < nums.size(); ++i ) {
            if ( nums[i] > tail[end] ) {
                tail.push_back( nums[i] );
                ++end;
            }
            else {
                // i前面找到第一个大于nums[i]的数并替换
                int index = getFirst( tail, end, nums[i] );
                tail[index] = nums[i];
            }
        }

        return end + 1;
    }

    int getFirst( vector<int>& tail, int end, int target ) {
        int start = 0;

        while ( start < end ) {
            int mid = ( start + end ) >> 1;

            if ( tail[mid] >= target ) 
                end = mid;
            else
                start = mid + 1;
        }
        
        return start;
    }
};
Ha publicado 183 artículos originales · ganado elogios 43 · vistas 60000 +

Supongo que te gusta

Origin blog.csdn.net/m0_37822685/article/details/104883114
Recomendado
Clasificación