博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Maximum Subarray 最大子数组
阅读量:6113 次
发布时间:2019-06-21

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

hot3.png

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.

More practice:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

 

这道题让我们求最大子数组之和,并且要我们用两种方法来解,分别是O(n)的解法,还有用分治法Divide and Conquer Approach,这个解法的时间复杂度是O(nlgn),那我们就先来看O(n)的解法,定义两个变量rescurSum,其中res保存最终要返回的结果,即最大的子数组之和,curSum初始值为0,每遍历一个数字num,比较curSum + numnum中的较大值存入curSum,然后再把rescurSum中的较大值存入res,以此类推直到遍历完整个数组,可得到最大子数组的值存在res中,代码如下:

public class Solution {

    public int maxSubArray(int[] nums) {

        int res = Integer.MIN_VALUE, curSum = 0;

        for (int num : nums) {

            curSum = Math.max(curSum + num, num);

            res = Math.max(res, curSum);

        }

        return res;

    }

}

 

题目还要求我们用分治法Divide and Conquer Approach来解,这个分治法的思想就类似于二分搜索法,我们需要把数组一分为二,分别找出左边和右边的最大子数组之和,然后还要从中间开始向左右分别扫描,求出的最大值分别和左右两边得出的最大值相比较取最大的那一个,代码如下:

 

public class Solution {

    public int maxSubArray(int[] nums) {

        if (nums.length == 0) return 0;

        return helper(nums, 0, nums.length - 1);

    }

    public int helper(int[] nums, int left, int right) {

        if (left >= right) return nums[left];

        int mid = left + (right - left) / 2;

        int lmax = helper(nums, left, mid - 1);

        int rmax = helper(nums, mid + 1, right);

        int mmax = nums[mid], t = mmax;

        for (int i = mid - 1; i >= left; --i) {

            t += nums[i];

            mmax = Math.max(mmax, t);

        }

        t = mmax;

        for (int i = mid + 1; i <= right; ++i) {

            t += nums[i];

            mmax = Math.max(mmax, t);

        }

        return Math.max(mmax, Math.max(lmax, rmax));

    }

}

 

转载于:https://my.oschina.net/iioschina/blog/1532088

你可能感兴趣的文章
MultiRow发现之旅(七)- 套打和打印
查看>>
Windows Forms 2.0 Programming 花边(002)——失算!第一章的下马威
查看>>
《WCF技术内幕》翻译12:第1部分_第2章_面向服务:概念汇总
查看>>
Java2Html使用详解
查看>>
C#字符串与字节数组互转
查看>>
Linux下Apache与MySQL+PHP的综合应用案例
查看>>
使用多级分组报表展现分类数据
查看>>
cocos2d-x中Node与Node层级架构
查看>>
2月第3周回顾:黑帽大会华府召开 场面热闹创新不多
查看>>
VB 6.0中判断是否Access 2010中存在指定表格
查看>>
流水线上的思考——异步程序开发模型(1)
查看>>
为SharePoint网站创建自定义导航菜单
查看>>
分布式系统的Raft算法——在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新 意味着还是可能丢数据!!!...
查看>>
检查点(Checkpoint)过程如何处理未提交的事务
查看>>
iphone开发中的手势操作:Multiple Taps
查看>>
牛刀小试Oracle之FRA学习
查看>>
Azure SQL Database (21) 将整张表都迁移到Azure Stretch Database里
查看>>
jquery autocomplete实现读取sql数据库自动补全TextBox
查看>>
前端构建工具gulp入门教程(share)
查看>>
springmvc原理
查看>>