题目链接
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)
}