題目描述
給定一個無序的整數數組,找到其中最長上升子序列的長度。
示例:
輸入: [10,9,2,5,3,7,101,18]
輸出: 4
解釋: 最長的上升子序列是 [2,3,7,101],它的長度是 4。
說明:
可能會有多種最長上升子序列的組合,你只需要輸出對應的長度即可。
你算法的時間複雜度應該爲 O(n2) 。
進階: 你能將算法的時間複雜度降低到 O(n log n) 嗎?
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-increasing-subsequence
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
-----------------------------------------------------------------------------------------------------------------------------------------------
白話題目:
不分順序取子序列,但是子序列要上升及遞增,最大的長度有啥?
算法:
選擇dp[i]爲以這個元素爲結尾的子序列的和,那麼下一個nums[i]如果比前面的nums[j]大的話就可以作爲新的子序列的最大值加入,dp[i]是否大於之前的那個元素nums[j]+1呢?
詳細解釋關注 B站 【C語言全代碼】學渣帶你刷Leetcode 不走丟 https://www.bilibili.com/video/BV1C7411y7gB
C語言完全代碼
#include <stdio.h>
#include <stdlib.h>
int lengthOfLIS(int* nums, int numsSize)
{
if(numsSize==0) return 0;
if(numsSize==1) return 1;
int dp[numsSize+1];
int LIS=1;
int i=1;
dp[0]=1;
for( i=1; i<numsSize; i++)
{
dp[i]=1;
int j=0;
for(j=0; j<i; j++)
{
if(nums[i]>nums[j]&&dp[i]<dp[j]+1)
{
dp[i]=dp[j]+1;
}
}
if(LIS<dp[i])
{
LIS=dp[i];
}
}
return LIS;
}
int main()
{
int numsSize;
printf("請輸入數組個數,例如(8)\n");
scanf("%d",&numsSize);
printf("請輸入數組,例(10 9 2 5 3 7 101 18):");
int nums[numsSize];
int i;
for(i=0; i<numsSize; i++)
{
scanf("%d",&nums[i]);
}
int result=lengthOfLIS(nums,numsSize);
printf("%d",result);
return 0;
}