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

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

逆向思维,针对结果每次寻找最大的数(肯定是剩余和组成的结果)
根据最大值和剩余和的关系进行处理
具体可以参考代码中的注释
时间复杂度
O(N)
Runtime: 32 ms (beats 100%)
Memory Usage: 6.8 MB

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)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值