學渣帶你刷Leetcode0300.最長上升子序列

題目描述

給定一個無序的整數數組,找到其中最長上升子序列的長度。

示例:

輸入: [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
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

-----------------------------------------------------------------------------------------------------------------------------------------------

白話題目:

不分順序取子序列,但是子序列要上升及遞增,最大的長度有啥?

算法:

類似於學渣帶你刷Leetcode0053. 最大子序和

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章