給出乙個由無重複的正整數組成的集合,找出其中最大的整除子集,子集中任意一對 (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進行一下排序即可。需要輸出子集,那麼只要開...