給你一個由 無重復 正整數組成的集合 nums ,請你找出并返回其中最大的整除子集 answer ,子集中每一元素對 (answer[i], answer[j]) 都應當滿足:
answer[i] % answer[j] == 0 ,或
answer[j] % answer[i] == 0
如果存在多個有效解子集,返回其中任何一個均可。
示例 1:
輸入:nums = [1,2,3]
輸出:[1,2]
解釋:[1,3] 也會被視為正確答案。
示例 2:
輸入:nums = [1,2,4,8]
輸出:[1,2,4,8]
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 2 * 109
nums 中的所有整數 互不相同
解題思路
從小到大進行排序,每次判斷兩個元素的整除關系時,只需要枚舉前面元素,判斷是否存在整除關系即可。
因為整除關系存在傳遞性,例如1,2,4,8,16,16整除8以外,同時也能整除能被8整除的元素(例如 1,2,4)
因此只需要一個一維數組記錄當前元素能夠整除元素的個數
狀態轉移方程為:
for j,v:=range nums[:i] {//遍歷前面元素if nums[i]%v==0&&dp[j]+1>dp[i]{//當前nums[j]可以被nums[i]整除dp[i]=dp[j]+1//因此與nums[j]有整除關系的,與nums[i]也存在相同的整除關系 //加一是因為與nums[i]與nums[j]也存在整除關系}}
代碼
func largestDivisibleSubset(nums []int) []int {sort.Ints(nums)n := len(nums)dp := make([]int, n)for i:=range dp{dp[i]=1}maxS,maxV:=1,nums[0]for i := 1; i < n; i++ {for j,v:=range nums[:i] {if nums[i]%v==0&&dp[j]+1>dp[i]{dp[i]=dp[j]+1}}if dp[i]>maxS{maxS,maxV=dp[i],nums[i]}}var res []intif maxS==1{res=append(res,maxV)return res}for i := n-1; i >=0 ; i-- {if maxS>0&&maxV%nums[i]==0&&dp[i]==maxS{maxS--maxV=nums[i]res=append(res,maxV)}}return res}