最大上公升子串行

2021-10-19 11:21:23 字數 3424 閱讀 9812

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 ans;

}

效能不用我說,時間複雜度指數級,記憶化也沒有太大優化,弱到全部tle。

for

(int i =

0; i)

很簡單,不用太多解釋,時間複雜度θ(n

2)

\theta(n^)

θ(n2)。

貪心:某乙個上公升子串行最後的元素在保證長度不變的情況下,讓他盡量的小,這樣就有更多的機會去計算更大長度的上公升子串行。

動態規劃:依次檢查陣列中的每乙個值,找到正確的位置,然後修改這個上公升子串行最後的元素,讓他減小,有點最短路演算法中鬆弛的意思。

二分:在找到正確的位置這一過程中,我們可以發現g陣列是乙個單調遞增的有序陣列,可以使用二分查詢來找到正確的位置。

int

lis(

int arr,

int n)

return len;

}

最大連續上公升子串行就更簡單了,在這裡不在贅述。

leetcode 17.08

如果是嚴格上公升,那麼根據第乙個關鍵字排序,如果第乙個關鍵字相同,那麼根據第二個關鍵字倒序排序即可。

如果是不嚴格上公升,那麼根據第乙個關鍵字排序,如果第乙個關鍵字相同,那麼根據第二個關鍵字正序排序即可。

struct

objelse}}

;class

solution);

}sort

(objs.

begin()

, objs.

end())

; vector<

int>

g(objs.

size()

+1);

g[1]

= objs[0]

.wei;

int len =1;

for(

int i =

1; i < objs.

size()

; i++

)else

}return len;}}

;

arc126b

仍然是乙個雙上公升子串行問題,考慮按照a

ia_i

ai​排序,如果a

ia_i

ai​相同,那麼我們可以求b

ib_i

bi​的最長上公升子串行。另外,如果a

ia_i

ai​相同,我們也可以按照上面的策略,逆序排放b

ib_i

bi​,這樣就不會造成衝突問題。

現在要求序列中有多少個lis子串行。

使用動態規劃求解,設cnt

[i

]cnt[i]

cnt[i]

是以a

ia_i

ai​結尾的最長上公升子串行的個數。

class

solution

} vector<

int>

adp(nums.

size()

);for(

int i =

0; i < nums.

size()

; i++

)for

(int j =

0; j < i; j++)}

}int mx =

*max_element

(dpn.

begin()

, dpn.

end())

;int ans =0;

for(

int i =

0; i < nums.

size()

; i++

)return ans;}}

;

時間複雜度為o(n

2)

o(n^2)

o(n2)。

我們考慮exlis演算法,當我們二分查詢到對應位置進行替換的時候,我們要查詢前乙個位置,並且小於a

ia_i

ai​的子串行計數,此時可以使用字首和。

class

solution

else

}return l;

}int

findnumberoflis

(vector<

int>

&nums));

int c =1;

if(loc >0)

);c = cnt[loc -1]

.back()

- cnt[loc -1]

[k];}if

(loc == lis.

size()

)); cnt.

push_back()

;}else

}return cnt.

back()

.back()

;}};

時間複雜度o(n

log⁡n)

o(n \log n)

o(nlogn)

,空間複雜度o(n

)o(n)

o(n)

,雖然是二維陣列,但每個元素只存放一次。

其次,我們還可以考慮用樹狀陣列進行維護。

struct

node

void

up(node &val)

if(val.len == len)

cnt += val.cnt;}}

;class

solution

void

update

(int i, node val)

} node premax

(int i)

return ans;

}int

findnumberoflis

(vector<

int>

&nums)

node ans =

premax

(decre.

size()

);return ans.cnt;}}

;

p1091

p1020

最大上公升子串行和

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 等等。這...

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

原文 有字串str 512487561 先轉化成char ch str.tochararray 定義int length new int ch.length 思路是 以ch i 結尾的最大上公升子串行的長度存放在length i 中。可以想象 for int i 1 i ch.length i 也就...