zoukankan      html  css  js  c++  java
  • LeetCode OJ平台上Maximum Subarray题目O(n)复杂度解决方式

    原始题目例如以下,意为寻找数组和最大的子串,返回这个最大和就可以。

    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.

    最普通的方法就是两层循环来寻找,复杂度为O(n^2).

    在木易先森的指导下,有一个极其简单的O(n)复杂度的方法:

    -    先找出数组max值,假设max小于0 ,啥也别说了,直接返回max.

    -    设置辅助变量currentmax=0;数组从头至尾扫描一遍

         -    假设currentmax + A[i] <= 0,意味着这个子串对于我们寻找最大和是没有不论什么帮助的,此时,直接再置currentmax = 0

         -    假设currentmax + A[i] > 0,意味着这个子串的和是有意义的,将这个和跟max比較,时刻保持max的值是当前最理想的最大值

    -    最后返回max就可以

    源码例如以下:

    public class Solution {
        public static int maxSubArray(int[] A) {
            if(A.length == 0)
                return 0;
            int max = A[0];
            for(int i = 0; i < A.length; i ++)
                if(A[i] > max)
                    max = A[i];
            if(max <= 0)
                return max;
            int currentmax = 0;
            for(int i = 0;i < A.length; i ++){
            	currentmax += A[i];
            	if(currentmax <= 0){
            		currentmax = 0;
            		continue;
            		}
            	else{
            		if(currentmax > max)
            			max = currentmax;
            	}
            	}
            return max;
            }
    }


  • 相关阅读:
    Linux下修改HOSTNAME
    IBM服务器 IMM日志收集
    X3850 Linux 下DSA日志收集办法
    Linux查看进程内存占用及内存使用情况
    集成开发注意事项(持续更新)
    SOAPUI请求及mockservice 使用
    Linux下su与su -命令的区别
    从XML文件中获取格式化的文本信息
    前端实现下载文件
    动态表单如何对部分表单字段校验
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3862873.html
Copyright © 2011-2022 走看看