368.最大整除子集

80 阅读1分钟

题目:
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
}