zoukankan      html  css  js  c++  java
  • 剑指offer-第五章优化时间和空间效率(连续子数组的最大和)

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

    思路:我们的最直观的想法就是求出这个数组中的所有的子数组,然后比较他们的和的大小,如果输入的数组元素个数为N,那么就要有N(N+1)/2个子数组。很明显是不符合要求的。然后我可以用动态规划的思想。假设sum(i)以第i个元素结尾的连续的最大的子数组和。假设i前面的子数组之和都已经求出。那么sum(i)要么就是sum(i-1)和a[i]的和,要么就是a[i]本身,这个取决于Sum(i-1)是否大于0.由于只需要保存前一次的结果,而不需要向其他的动态规划一样保存之前所有的结果,因此时间复杂度很低。

    第二种思路:举例分析数组的规律

    两者者有异曲同工之妙。

    public class subArraySumMax {
        private boolean  isInvaildPut = false;//要来区分无效输入返回的0,还是数组最大值返回为0;
        
        public int subArraySumMaxOfArray(int[] a){
            if(a==null){
                isInvaildPut=true;
                return 0;
            }
            isInvaildPut=false;
            int curNumber=a[0];//记载当前子数组的和的值
            int maxNumber=a[0];//存放子数组最大和的值
            for(int i=1;i<a.length;i++){
                if(curNumber<=0)
                    curNumber=a[i];
                else
                    curNumber+=a[i];
                if(curNumber>maxNumber)
                    maxNumber=curNumber;
            }
            return maxNumber;
        }
        public static void main(String[] args){
            int[] a={1,-2,3,10,-4,7,2,-5};
            subArraySumMax subMax=new subArraySumMax();
            int sum=subMax.subArraySumMaxOfArray(a);
            System.out.println(sum);
            
        }
    
    }
  • 相关阅读:
    第五:Nutanix的Prism管理手册
    第四:Nutanix的开关机步骤
    Exchange2016DR(异地容灾)环境:重要
    博客的开始
    sql查询日期型内容+oracle
    expdp导出oracle数据库中指定表空间下数据
    oracle 锁表的解决sql语句(pl/sql 删除表中数据锁表)
    centos 关闭防火墙+开启ssh服务
    显示桌面 我的电脑
    查看电脑连接过的wifi—通过命令行
  • 原文地址:https://www.cnblogs.com/hupp/p/4750593.html
Copyright © 2011-2022 走看看