zoukankan      html  css  js  c++  java
  • leetcode面试题42. 连续子数组的最大和

      总结一道leetcode上的高频题,反反复复遇到了好多次,特别适合作为一道动态规划入门题,本文将详细的从读题开始,介绍解题思路。

    题目描述示例动态规划分析代码结果

    题目

      面试题42. 连续子数组的最大和
      地址:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/

    描述

      输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组  成一个子数组。求所有子数组的和的最大值。

      要求时间复杂度为O(n)

    示例

      输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
      输出: 6
      解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

    动态规划

      这道题网上的解法有很多,这里介绍一下动态规划的解法,首先我们应该思考这道题可不可以使用动态规划来做?
      动态规划解决的问题是多阶段决策最优模型,也可以理解成全局最优。一个问题的解决过程,对应着多个决策阶段,每一个决策阶段都对应着一组状态。我们要做的就是寻找一组决策序列,最终产生期望的最优解。
      这里隐含着使用动态规划的几个条件
      最优子结构:最终的最优解,可以通过子结构的最优解推导出来。
      无后效性:我们关注的问题是状态。状态一旦确定了,就不受后续决策阶段的影响。

    分析

      我们分析一下这道题,全局最优解是序列子数组的最大和,但是这里我们可以把这道题进行一个拆分:
      1.求以arr[i]结尾的序列子数组最大和组成的数组dp
      2.数组dp中求最大值
      这样我们就可以得到一个dp方程:dp[n] = Max(dp[n - 1] + arr[n], arr[n]);(这道题的难点就在于这里,需要进行一个转换)

    代码

     1class Solution {
    2    public int maxSubArray(int[] nums) {
    3        int max = nums[0];
    4        int tmp = nums[0];
    5        for(int i = 1; i < nums.length; i++){
    6            tmp = Math.max(tmp + nums[i], nums[i]);
    7            max = Math.max(tmp, max);
    8        }
    9        return max;
    10    }
    11}

      这里使用了一个tmp变量,代替了图解中的dp数组,节省了一部分存储空间。

    结果


      最后,期待您的订阅和点赞,专栏每周都会更新,希望可以和您一起进步,同时也期待您的批评与指正!
  • 相关阅读:
    神经网络损失函数公式解读
    centos 安装python PIL模块
    Centos6.8 安装dlib库时出错【升级gcc 到4.9.0以上】
    python DBUtils 线程池 连接 Postgresql(多线程公用线程池,DB-API : psycopg2)
    Postgresql 查看锁的过程
    Python yield 函数功能
    Centos6.8 安装spark-2.3.1 以及 scala-2.12.2
    Oracle---常用SQL语法和数据对象
    Oracle---number数据类型
    java框架篇---hibernate之连接池
  • 原文地址:https://www.cnblogs.com/nedulee/p/12492889.html
Copyright © 2011-2022 走看看