题目:
xz
算法:
方法一:暴力模拟:
该方法错误,存在反例
func largestDivisibleSubset(nums []int) []int {
ans := make([]int, 0)
for i := 0; i < len(nums) - 1; i ++ {
tmp := []int{nums[i]}
for j := i + 1; j < len(nums); j ++ {
allMatch := true
for k := range tmp {
if tmp[k] % nums[j] != 0 && nums[j] % tmp[k] != 0 {
allMatch = false
break
}
}
if allMatch {
tmp = append(tmp, nums[j])
}
}
if len(tmp) > len(ans) {
ans = tmp
}
}
return ans
}
方法一:动态规划
leetcode.cn/problems/la…
func largestDivisibleSubset(nums []int) []int {
sort.Ints(nums)
n := len(nums)
dp := make([]int, n)
g := make([]int, n)
ans := make([]int, 0)
maxCntPreIndex := 0
maxCnt := 0
for i := 0; i < n; i ++ {
long := 1
prev := i
for j := 0; j < i; j ++ {
if nums[i] % nums[j] == 0 {
if dp[j] + 1 > long {
long = dp[j] + 1
prev = j
}
}
}
if long > maxCnt {
maxCnt = long
maxCntPreIndex = i
}
dp[i] = long
g[i] = prev
}
for len(ans) != maxCnt {
ans = append(ans, nums[maxCntPreIndex])
maxCntPreIndex = g[maxCntPreIndex]
}
return ans
}