/** 53.Maximum Subarray * 2016-5-7 by Mingyang * 如果我们从头遍历这个数组。对于数组中的其中一个元素,它只有两个选择: 1.* 要么加入之前的数组加和之中(跟别人一组) * 2. 要么自己单立一个数组(自己单开一组)* 所以对于这个元素应该如何选择,就看他能对哪个组的贡献大。如果跟别人一组* 能让总加和变大,还是跟别人一组好了;如果自己起个头一组,自己的值比之前加和的值还要大,那么还是自己单开一组好了。* 所以利用一个dp数组,记录每一轮sum的最大值,dp[i]表示当前这个元素是跟之前数组加和一组还是自己单立一组好,然后维护一个全局最大值即位答案* 那么这道题目开始想能不能用maxSubArray(int A[], int i, int j), which means the maxSubArray for A[i: j].* 但是这么写子函数就很难找到这种关系。那么我们接下来就怎么做呢?* maxSubArray(int A[], int i), which means the maxSubArray for A[0:i ] which must has A[i] as the end element.* 那么就下来的关系就是:* dp[i] = Math.max(A[i], dp[i - 1] + A[i]);* 也就是说对于A[i]到底加不加进来,我们只需要看这个加进来大还是单独大。* 因为你如果加进来都比单独大,那么后面还是一个增量。* 千万不要写成:dp[i] = Math.max(dp[i-1], dp[i - 1] + A[i]);     * Kadan's algorithm  O(n) time and O(1) space     */public static int maxSubArray(int[] A) {int[] dp = new int[A.length];int max = A[0];dp[0] = A[0];for (int i = 1; i < A.length; i++) {dp[i] = Math.max(A[i], dp[i - 1] + A[i]);      // 这里只比较了自己另外开一个,和原来的加一起开的区别max = Math.max(max, dp[i]);}    //不是每一个dp都是返回最后一个dp值哦!有可能返回全局变量return max;}/** 下面是我自己的解法,开始想的有点复杂,然后后面仔细列举一下也是蛮简单的,这里用了一个dp数组* dp[i]表示包括i在内的连续数组的最大值,而不是到i最优的结果* [-1,-2]那么dp[1]=-3,因为要把-2包括进来* 那么如果每个数自己就很大,比加起前面累积的dp还大,那么久自成一家* 否则的话需要加起来,每次更新dp的时候与全局变量max比较一下*/public int maxSubArray1(int[] nums) {int len=nums.length;int max=nums[0];int[] dp=new int[len];dp[0]=nums[0];for(int i=1;i<len;i++){if(nums[i]>nums[i]+dp[i-1]){dp[i]=nums[i];max=Math.max(max,dp[i]);}else{dp[i]=dp[i-1]+nums[i];max=Math.max(max,dp[i]);}}return max;}

转载于:https://www.cnblogs.com/zmyvszk/p/5469683.html

53.Maximum Subarray相关推荐

  1. [Lintcode]41. Maximum Subarray/[Leetcode]53. Maximum Subarray

    41. Maximum Subarray/53. Maximum Subarray 本题难度: Eas Topic: Dynamic Programming Description Given an ...

  2. 【DP】LeetCode 53. Maximum Subarray

    LeetCode 53. Maximum Subarray Solution1:我的答案 动态规划 class Solution { public:int maxSubArray(vector< ...

  3. 【动态规划】LeetCode 53. Maximum Subarray

    LeetCode 53. Maximum Subarray 原题描述(求子序列最大和/最大子串):Find the contiguous subarray within an array (conta ...

  4. LeetCode(53):Maximum Subarray

    Maximum Subarray: Find the contiguous subarray within an array (containing at least one number) whic ...

  5. [LeetCode]: 53: Maximum Subarray

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...

  6. 53. Maximum Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  7. 重做53. Maximum Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  8. leetCode 53. maximum subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  9. LeetCode#53 Maximum Subarray

    Problem Difinition: Find the contiguous subarray within an array (containing at least one number) wh ...

最新文章

  1. k-means优化 k-means距离的选择 k-medoids对比
  2. AJAX推送与拉取方式的比较
  3. c++经典书籍--深度探索C++对象模型
  4. 矩阵分解法做推荐系统
  5. ecshop模板支持php,[老杨原创]关于ECSHOP模板架设的服务器php版本过高报错的解决方法集合...
  6. 步步为营:Asp.Net序列化Json格式的两种方法
  7. linux服务器中用U盘或者移动硬盘拷贝数据
  8. python 条件语句、循环语句
  9. python 基础 集合
  10. Python的web小游戏启动心得
  11. 学习Java面向对象编程和设计模式最好的5本书
  12. 【Shader入门精要】第十四章——卡通风格的渲染
  13. 手机app端,token的详解
  14. 深度xp系统插入光盘显示上一张光盘资料解决方法
  15. 最好的PC端Android模拟器是哪个软件?
  16. ncre二级c语言程序设计,考纲分析:NCRE二级C语言程序设计辅导
  17. 由俭入奢易,由奢入俭难
  18. 进程间通信有哪几种方式?进程间通信的方法详解
  19. 教你30元自制考勤打卡系统!
  20. android 横竖切换快捷键,Android横竖屏切换总结

热门文章

  1. 系统带你学习 WebAPIs 第五讲
  2. Mysql 开启远程连接
  3. javascript --- 使用语法糖class定义函数
  4. Vue学习笔记(一)—— 什么时候需要import Vue from 'vue'
  5. 特斯拉自动驾驶系统秘密,来自特斯拉AI总监爆料
  6. Ubuntu Server 之Apache2 虚拟主机配置指南(个人实践解读)
  7. [CareerCup] 9.4 Subsets 子集合
  8. shell脚本工具之控制结构
  9. redhat 挂载 iso文件 提示 mount :not a directory
  10. Java程序通过批处理文件定时执行