Leetcode300. 最长上升子序列(C语言)
题目:
给定一个无序的整数数组,找到其中最长上升子序列的长度。例:
*输入: [10,9,2,5,3,7,101,18]
输出: 4 *
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
思路:
法一:动态规划。第i个元素之前的最小上升子序列的长度无非就是max(dp[i],dp[j]+1);
法二:二分查找法。
dp[i]存储子序列中第i个数,第二个数和第一个数比较,若大则接在他后面,若小则替换;
若有i个数,每进一个新数,都用二分查找法来得知要替换的位置;
for循环 + 二分查找,时间复杂度O(NlogN)。
代码:
int lengthOfLIS(int* nums, int numsSize){
int i, len = 0, dp[numsSize+1];
dp[0] = INT_MIN;
for(i = 0;i < numsSize;++i)
{
if(nums[i] > dp[len]) dp[++len] = nums[i]; //若升序,则加进数组
else //非升序,nums[i]替代当前dp
{
int low = 1, high = len, mid;
while(low < high) //dp只有一个数无序
{
mid = low + (high - low) / 2;
if(dp[mid] < nums[i]) low = mid + 1; //往后找
else high = mid; //往前找
}
dp[low] = nums[i];
}
}
return len;
}
//参考评论区@ASL