给一个数组,找出数组中的最大值最小值,最小值必须在最大值前面,也就是说最小值的下标必须比最大值的下标小。
要求时间复杂度O(n),空间复杂度O(1)
对于这个问题,O(n)找出数组的最大值最小值是没有问题的,问题在于如果最大值在最小值前面那么这个是不合法的,必须重新再找,所以如果用一般的方法怎么也得O(n^2)。
或许我们可以借助dp的思想,通过求解最优子问题来找到解。
如果我们在第i次循环已经找到了针对a[0]到a[i]的min和max和它们的diff,那么我们就检查a[i + 1],如果a[i + 1] < min,那么因为a[i + 1]左边的值都比它大,所以a[i + 1]只能是下一个可能的min的值,所以我们可以把min的值更新为a[i + 1]。如果a[i + 1] > max,那么实际上只要把max更新成a[i + 1],并计算新的diff。如果a[i + 1] = max,此时有可能a[i]已经更新成了新的min,所以要计算新的diff。
当我们更新min值的时候,如果此时已经到了数组的最后一个元素,而max并没有更新,那么最后要通过max-diff来反推出上次更新前的min。
所以可能最后代码像这个样子(未验证):
网友评论