博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《剑指 Offer》——30、连续子数组的最大和
阅读量:2344 次
发布时间:2019-05-10

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

1. 本题知识点

动态规划

2. 题目描述

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)。

3. 解题思路

本题可以看做是一个多阶段决策找最优解的问题,因此可以用典型的动态规划思想来求解。

用 res[i] 表示以第 i 个元素结尾的子数组的最大和,那么有以下递推公式:

res[i]=max(res[i-1]+data[i], data[i])

这个公式的含义是:当以第 i-1 个数字结尾的子数组中所有数字的和小于 0 时,把这个负数与第 i 个数累加,则得到的和比第 i 个数字本身还要小,所以这种情况下 res[i] 就是第 i 个数字本身。反之,如果以第 i-1 个数字结尾的子数组中所有数字的和大于 0,则与第 i 个数字累加就得到以第 i 个数字结尾的子数组中所有数字的和。

4. 代码

public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
int max = array[0]; for (int i = 1; i < array.length; i++) {
if (array[i - 1] > 0) {
array[i] += array[i - 1]; } max = Math.max(max, array[i]); } return max; }}

转载地址:http://rdjvb.baihongyu.com/

你可能感兴趣的文章
子页面跳转
查看>>
常用算法总结
查看>>
数据库连接池
查看>>
JAVA Webservice
查看>>
Hibernate自动生成实体类
查看>>
Java Memcached
查看>>
JAVA WebSpider
查看>>
XML自动建表/存库
查看>>
Java实现Web服务器
查看>>
C# readonly与const的区别
查看>>
MFC 自定义消息的一般过程
查看>>
剖析Windows消息处理机制
查看>>
多线程入门教程(二)基本概念
查看>>
多线程入门教程(三)线程控制
查看>>
多线程入门教程(四)线程间通信
查看>>
多线程入门教程(五)MFC的多线程
查看>>
多线程入门教程(六)综合实例
查看>>
C/C++ 多线程学习心得
查看>>
C/C++四种退出线程的方法
查看>>
多线程编程要点
查看>>