[解题报告]Construct Target Array With Multiple Sums

题目链接
N个1,每次求和后将和随机赋给数组的一个位置target[i]
给定target数组问是否可以组成该数组

逆向思维,针对结果每次寻找最大的数(肯定是剩余和组成的结果)
根据最大值和剩余和的关系进行处理
具体可以参考代码中的注释
假设target数组的长度为N
时间复杂度
O(N)

func isPossible(target []int) (found bool) {
	max := 0
	idx := 0
	sum := 0
	for i, v := range target {
		sum += v
		if v > max {
			max = v
			idx = i
		}
	}

	if max == 1 {
		return true
	}

	left := sum - max

	if left <= 0 {
		return false
	}
	target[idx] %= left // 余除结果设为x,那么left*N+x 则是原值,表示使用了N次left值组成了这个target[idx]
	if target[idx] == 0 { // max是left的整数倍 证明max是leftN+1次组出来的,而target[idx]本身的值就是left
		target[idx] = left
	}
	if target[idx] == max { // left比max还大 证明left组不出来这个max
		return false
	}

	return isPossible(target)
}
发布了15 篇原创文章 · 获赞 2 · 访问量 1350

猜你喜欢

转载自blog.csdn.net/yeehok/article/details/104870856