一道面试题,最长递增子序列,使用二分查找+动态规划,时间复杂度为nlog(n)。写的时候发现二分查找的变种需要注意的细节还是挺多的。
#include <stdlib.h>
#include <stdio.h>
#define MIN -999999
int binary_search(int val[], int size, int key)
{
int start, end, mid;
start = 0;
end = size;
while(start < end - 1)
{
mid = start + (end - start) / 2;
if(val[mid] > key)
end = mid - 1;
else
start = mid;
}
if(val[end] < key)
return end;
else
return start;
}
int lis(int arr[], int size)
{
int *val = (int *)malloc(sizeof(int) * (size + 1));
int length = 1;
int i,j;
val[0] = MIN;
for(i = 0; i< size; i++)
{
j = binary_search(val, length - 1, arr[i]);
if(j == length - 1)
val[++ length - 1] = arr[i];
else
val[++ j] = arr[i];
}
free(val);
return length - 1;
}