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
- 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;
}
};