最大上公升子串行LIS(Java)

2021-07-31 06:51:41 字數 1901 閱讀 5083

原文:

有字串str=」512487561」;先轉化成char ch=str.tochararray();定義int length=new int[ch.length];

思路是:以ch[i]結尾的最大上公升子串行的長度存放在length[i]中。可以想象:

for (int i = 1; i < ch.length; i++)
也就是在」i」之前的字元中(也就是「j」代表的範圍),如果有ch[i]>ch[j],那麼這個字元就有可能是以ch[i]結尾的最大上公升子串行的前乙個字元(那麼這個所謂的「前乙個字元」是不是也和ch[i]一樣,有它自己的「前乙個字元」,直到前面沒有能能接在前的字元為止),我們從這些有可能的字元中選擇對應長度最長的(去length陣列的對應位置找到最大值),然後再把這個最大值加1,再存放到length[i]上,一直到最後,然後取length陣列中最大的數,也就是最大上公升子串行的長度了。

原博文中的佇列操的問題處理也很巧妙。博主沒有仔細介紹思路,我在補充一下:先從左把遍歷,得到乙個length1陣列,裡面的值代表的是以ch陣列當前位置為結尾(從左往右)的最大子串行的長度。然後將原陣列逆序再重複一次,得到length2陣列,然後再把length2逆序(逆序了才是一一對應),得到的就是以ch陣列當前位置為結尾(從右往左)的最大子串行的長度。length1+length2,得到的就是以ch[i]結尾的左邊最大上公升子串行和右邊最大上公升子串行的長度之和,就是從兩邊向中間靠攏的感覺。當然要減去乙個1,因為ch[i]在兩個長度裡都算了一次,重複了。此時求得的和的最大值也就是「山頂」了。也就是得到了乙個分別從左從右看加起來最長的乙個波浪形鏈。此時用ch.length減去這個最大值得到的就是要從中去除的那些同學數量。

我自己又思考了一下,把原來的方法改進了:

public

class lis

public

static

intlis(string str)

}if( max==ans || ch[i]//max==ans表示當前得到的是最長的子串行,直接存下來就好了。否則得到的不是最長的,就要和之前的比較,存較小的。

ch[max]=ch[i];

}return ans+1;//下標加1才是長度。

}}

思路**這篇博文:其實我只看懂了一點點,從中得到了一條資訊:用陣列下標值表示以當前字元結尾的最大上公升子串行的長度)

舉例說明思路:str=「21548974」

第一步:ch[0]=2,前面沒有了,直接存在ch[0]中,此時ans(表示目前得到的最優解)=0,實際長度是ans+1.ch[0]就乙個數,以他結尾的當然長度是1把。

第二步:ch[1] = 1 < ch[ans],所以以他結尾的長度也是0,但是,此時也就是說有兩個長度為1的了,為了後面考慮,我們選擇保留較小的乙個(小的更容易被後面的數字接上),也就是ch[ans]=ch[1]。ans=0;

第三步:ch[2]=5>ch[ans],ans=ans+1=1,ch[ans]=ch[2]。

第四步:ch[3]=4,ch[3]< ch[ans],但是ch[3]>ch[ans-1],所以ans=(ans-1)+1=1,因為之前ch[2]對應的ans也等於1,那麼我們同樣取最小的保留,也就是ch[ans]=ch[3]。

第五步:ch[4]=8>ch[ans],ans=ans+1=2,ch[ans]=ch[4]。

……..

也就是:找到前面比他小的值,然後改變ans和儲存該值(此時還要比較大小關係,具體看**)。

**的空間複雜度為o(n)(目前我看到的最小的也是o(n)),時間複雜度我算不清,應該是o(nlogn)(2為底)左右,甚至更優。

其實我還有個問題沒有解決,如果想要輸出這個最大序列,那麼該如果做為好?想構造單鏈表形式的,也就是用乙個標記,沒時間了,就先放放吧。

最大上公升子串行

int lis int arr,int idx,int upper 初始化為上乙個idx上界為upper int ans lis arr,idx 1,upper if arr idx upper 如果可以,調整上界 ans max ans,lis arr,idx 1,arr idx 1 return...

最大上公升子串行和

3532 最大上公升子串行和 檢視 提交 統計 提問 總時間限制 1000ms 記憶體限制 65536kb 描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 i...

最大上公升子串行和

描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等。這...