博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 53. Maximum Subarray
阅读量:5063 次
发布时间:2019-06-12

本文共 1353 字,大约阅读时间需要 4 分钟。

原题链接在这里:

题目:

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

For example, given the array [−2,1,−3,4,−1,2,1,−5,4],

the contiguous subarray [4,−1,2,1] has the largest sum = 6.

题解:

采用的是DP解法. 把原有问题拆成小问题. maxSubArray(int [] nums, int i). 表示到 [0,i]段最大的sub array. 前提是包括 i 元素.

maxSubArray(nums, i) = nums[i] + maxSubArray(nums, i-1) > 0 ? maxSubArray(nums, i-1) : 0.

同时维护全局最大值.

历史信息就是local[i-1] 和 global[i-1], 更新当前信息时先更新局部最优.

local[i] = Math.max(local[i-1]+nums[i], nums[i]), 有可能local[i-1]是负数,就直接取nums[i], 然后更新全局最优.

global[i] = Math.max(lcoal[i], global[i-1]), 要么是原来的全局最优,要么是局部最优,此时能涵盖所有解。如果全局最优不包含当前值,那么会被维护在global[i-1]中,若包含当前值,那么就是local[i].

Note: local, global的初始化是nums[0]. 不能初始化成0, 然后从i=1开始,比如[-1], Output:0, Expected:-1, 这种corner case 就会出错.

Time Complexity: O(n).n = nums.length.

Space: O(1).

AC Java:

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

类似, , .

跟上.

Reference: 

转载于:https://www.cnblogs.com/Dylan-Java-NYC/p/4824950.html

你可能感兴趣的文章
jq 杂
查看>>
jquery datagrid 后台获取datatable处理成正确的json字符串
查看>>
作业一
查看>>
AJAX
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>
SpringMVC学习--springmvc原理
查看>>
大话数据结构(七)——单链表的整表创建与删除
查看>>
nodejs安装
查看>>
StringBulider简单用法
查看>>
Java笔记(十四) 并发基础知识
查看>>
发送短信验证码
查看>>
虚拟地址 线性地址 物理地址 傻傻分不清楚?
查看>>
位置与地图(三)给地图加入覆盖层
查看>>
Activiti的简单入门样例(经典的请假样例)
查看>>
关于Hibernate的一个简单小程序
查看>>
设计模式开发实际应用场景对应
查看>>
谢宝友:会说话的Linux内核
查看>>
e课表项目第二次冲刺周期第三天
查看>>
css display:none使用注意事项小结
查看>>