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

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

经典的求最大连续子数组和,以下有两种方法。

方法一:动规,复杂度O(n)

一遍扫描,R[i]表示以第i个元素结尾的最大连续子数组和,那么R[i+1] = max(A[i+1], R[i]+A[i+1])。代码如下:

int maxSubArray(int A[], int n) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        int i;        int max = A[0];        int tmp = A[0];        for(i = 1; i < n; i++){            if(tmp <= 0){                tmp = A[i];            }            else{                tmp += A[i];            }            if(tmp > max)                max = tmp;        }        return max;    }

方法二:分治的方法,把数组从中间分开,那么最大和有三种情况:全在左边,全在右边,两边都有。复杂度为O(nlgn)。

int maxSubArray(int A[], int left, int right){        if(left == right){            return A[left];        }        int middle = (left + right)/2;        int maxLeft = maxSubArray(A, left, middle);        int maxRight = maxSubArray(A, middle+1, right);        int maxToLeftBorder = A[middle];        int i,tmp=0;        for(i = middle; i >= 0; i--){            tmp += A[i];            if(tmp > maxToLeftBorder)                maxToLeftBorder = tmp;        }        int maxToRightBorder = A[middle + 1];        tmp = 0;        for(i = middle+1; i < right; i++){            tmp += A[i];            if(tmp > maxToRightBorder)                maxToRightBorder = tmp;        }        int max1 = maxLeft>maxRight?maxLeft:maxRight;        int max2 = maxToLeftBorder+maxToRightBorder;        return max1>max2?max1:max2;    }    int maxSubArray(int A[], int n) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        return maxSubArray(A, 0, n-1);    }

 

转载于:https://www.cnblogs.com/waruzhi/p/3335160.html

你可能感兴趣的文章
Hibernate 事物隔离级别
查看>>
Linux ——记一记那恐怖的 rm -f
查看>>
C# 指针之美
查看>>
Oracle 10 参数配置说明
查看>>
解决'System.OutOfMemoryException' 的问题
查看>>
消息队列RabbitMQ和ActiveMQ的生产者流量控制
查看>>
再论 重载、覆盖、多态与函数隐藏
查看>>
Android 用户界面---菜单
查看>>
【学术报告】云山物罩 大话‘大数据’
查看>>
用Setup系列函数完成驱动卸载安装[驱动安装卸载程序]
查看>>
巧妙利用JQuery和Servlet来实现跨域请求
查看>>
JS中生成与解析JSON
查看>>
[开发记录]事件驱动中一种优雅的退出方法
查看>>
java对象转JSON JS取JSON数据
查看>>
Spring MVC 学习 之 - 拦截器
查看>>
Leetcode: Minimum Window Substring
查看>>
jQuery 时间控件推荐
查看>>
27 GroupSock概述(一)——live555源码阅读(四)网络
查看>>
获取select的 text
查看>>
MongoDB学习笔记~官方驱动的原生Curd操作
查看>>