LeetCode 最大整除子集(動態規劃)

2021-09-12 14:42:28 字數 2893 閱讀 5064

給出乙個由無重複的正整數組成的集合,找出其中最大的整除子集,子集中任意一對 (si,sj) 都要滿足:si % sj = 0 或 sj % si = 0。

如果有多個目標子集,返回其中任何乙個均可。

示例 1:

輸入: [1,2,3]

輸出: [1,2] (當然, [1,3] 也正確)

示例 2:

輸入: [1,2,4,8]

輸出: [1,2,4,8]

思路分析:這道題與最長子序列非常類似,我們先將nums排序,然後使用動態規劃(時間複雜度o(n2),空間複雜度o(n2))

largestres[i]表示以nums[i]為結尾的最大子集

動態轉移方程:

if (nums[indexone] % largestres[indextwo].back() == 0 && largestres[indextwo].size() > largestres[indexone].size())

class

solution

int maxresindex =

0, maxressize =0;

//標記最長的下標

vector

int>

>

largestres

(numssize)

;//largestres[i]代表以i為結尾的最長結果

largestres[0]

.push_back

(nums[0]

);//初始化

for(

int indexone =

1; indexone < numssize;

++indexone)

} largestres[indexone]

.push_back

(nums[indexone]);

//最後需要放自己到尾端

非常的慢。。。

**優化,不難發現,在第二層for迴圈中,多次存在vector容器的複製,我們可以標記好最終需要複製的最長的序列下標,在退出第二層for迴圈後再進行複製vector複製。

class

solution

int maxresindex =

0, maxressize =0;

//標記最長的下標

vector

int>

>

largestres

(numssize)

;//largestres[i]代表以i為結尾的最長結果

largestres[0]

.push_back

(nums[0]

);//初始化

for(

int indexone =

1; indexone < numssize;

++indexone)

} largestres[indexone]

= largestres[tempmaxindex]

;//複製最終的vector容器

largestres[indexone]

.push_back

(nums[indexone]);

//最後需要放自己到尾端

再次優化上面使用到了兩層vector容器,蛋試在尋找最大的整除子集好像與之前的子集沒有關係,只是與之前子集的最後乙個元素有關。所以將二維vector容器進行降維。修改為path一維vector,path[i]表示以nums[i]為結尾的最大整除子集的前乙個元素為nums[path[i]].(時間複雜度o(n2),空間複雜度o(n))

class

solution

int maxresindex =

0, maxressize =0;

//標記最長的下標

vector<

int>

dp(numssize,1)

;//表示以nums[i]結尾的最大整除子集的大小

vector<

int>

path

(numssize,-1

);//表示路徑path[i]指向以nums[i]結尾的最大整除子集的前乙個子集元素的下標

for(

int indexone =

1; indexone < numssize;

++indexone)}if

(dp[indexone]

> maxressize)

}//將maxresindex標記的最長路徑尋找出來

最大整除子集

給出乙個由無重複的正整數組成的集合,找出其中最大的整除子集,子集中任意一對 si,sj 都要滿足 si sj 0 或 sj si 0。如果有多個目標子集,返回其中任何乙個均可。示例 1 輸入 1,2,3 輸出 1,2 當然,1,3 也正確 示例 2 輸入 1,2,4,8 輸出 1,2,4,8 這道題...

LeetCode368 最大整除子集

給出乙個由無重複的正整數組成的集合,找出其中最大的整除子集,子集中任意一對 si,sj 都要滿足 si sj 0 或 sj si 0。如果有多個目標子集,返回其中任何乙個均可。示例 1 輸入 1,2,3 輸出 1,2 當然,1,3 也正確 示例 2 輸入 1,2,4,8 輸出 1,2,4,8 然後可...

leetcode 368 最大整除子集

思路 其實和最長上公升子串行的思路基本一致。dp i 表示以nums i 結尾的最大的整數子集。dp i max dp j 1,dp i 其中nums j nums i 0 nums i nums j 0 為了避免6 2 4 這樣的序列出現,只需先對nums進行一下排序即可。需要輸出子集,那麼只要開...