子数组最大乘积

子数组最大乘积

http://www.nowcoder.com/questionTerminal/9c158345c867466293fc413cff570356

此题求最大值,可以将动态规划数组的第 i 个数字表示为加入第 i 个位置数字后的最大值。但由于此题存在负数乘法,可能最小值变为最大值,所以需要将最大值与最小值为 amax,amin 都存储(按照原始动态规划应该存储在 dp 数组中,但由于更新只与上一状态有关,可以直接存储数字,更新即可,这样可节约内存),然后比较 maxdp[i-1]*arr[i],mindp[i-1]*arr[i],arr[i] 之间的最大值与最小值,并更新 amax,amin。将每个状态的 amax 的最大值作为结果返回。
注:此思想可用于有负数的子数组最大和或差

func maxProduct( arr []float64 ) float64 {
    // write code here
//     if len(arr) == 1{
//         return arr[0]
//     }
    amin,amax,res := arr[0],arr[0],arr[0]
    for i:=1;i<len(arr);i++{
        amax,amin = max(max(amin*arr[i],amax*arr[i]),arr[i]),min(min(arr[i]*amin,arr[i]*amax),arr[i])
        res = max(amax,res)
    }
    return res
}

func max(i,j float64)float64{
    if i>j{
        return i
    }else{
        return j
    }
}

func min(i,j float64)float64{
    if i > j{
        return j 
    }else{
        return i
    }
}
全部评论

相关推荐

05-20 21:57
已编辑
门头沟学院 Java
喜欢吃卤蛋的悲伤蛙在提需求:建信融通没消息吧,我2说有实习挂简历不理了
点赞 评论 收藏
分享
lllllkin:感觉可以精简到一页简历,有些排版感觉不是必须的。 时间线越早的,你自己越熟悉的放前面。描述可以更精简些,一些问题解决感觉可以不用写具体技术栈,卖个关子,等面试官问。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务