zoukankan      html  css  js  c++  java
  • 连续子数组的最大乘积及连续子数组的最大和(Java)

    1. 子数组的最大和

    输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。例如数组:arr[]={1, 2, 3, -2, 4, -3 } 最大子数组为 {1, 2, 3, -2, 4} 和为8。

    解法1(时间复杂度O(N * N)空间复杂度O(1))

    求出所有的子数组的和,比较选择出最大值。利用双重循环就可以遍历到所有的子数组。

    public static void maxSum1(int arr[]) {
            int max=0,sum;
            for(int i=0;i<arr.length;i++)
            {
                sum=0;
                for(int j=i;j<arr.length;j++)
                {
                    //遍历数组的所有子数组,并将子数组的最大和保存在max中。
                    sum+=arr[j];
                    max=Math.max(max, sum);
                    //max保存最大的子数组的和
                }
            }
            System.out.println(max);
        }

    解法2(动态规划时间复杂度O(N)空间复杂度O(1))

    遍历数组,用 sum 保存子数组的和,当 sum<0 时 将 arr[i] 赋值给 sum,用 max 保存最大值。

    public static void maxSum(int arr[]){
            int max=0,sum=0;
            for(int i=0;i<arr.length;i++)
            {
                if(sum<=0){
                    sum=arr[i];
                    //如果 sum<0 重新赋值
                } else {
                    sum+=arr[i];
                }
                max=Math.max(sum, max);
                //将最大值保存在max中。
            }
            System.out.println(max);
        }

    2. 子数组的最大乘积

    输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。例如数组:arr[]={1, 2, 3, -2, 4, 3 } 最大子数组为 {4,3} 积为12。

    解法1(时间复杂度O(N * N)空间复杂度 O(1))

    跟上面求最大子数组的和类似,利用双重循环遍历所有的子数组,求出所有子数组中值最大的。

    public static void maxproduct(int arr[]){
            if(arr==null||arr.length==0)
                return;
                //如果数组为 null 或者长度为0直接返回
            int max=0,product=1;
            //max保存子数组的最大乘积,product 用来保存每一个子数组的积
            for(int i=0;i<arr.length;i++) {       
                product=1;
                for(int j=i;j<arr.length;j++){
                    product*=arr[j];
                    max=Math.max(product, max);
                    //max保存最大的子数组乘积
                    if(product==0)
                        break;
                    //如果当前子数组的乘积为0则以当前数组为头的后序数组的积全为0不用求。
                }
            }
            System.out.println(max);
        }

    解法2(动态规划 时间复杂度O(N )空间复杂度 O(1))

    跟上面求最大子数组的和类似,利用双重循环遍历所有的子数组,求出所有子数组中值最大的。以arr[i] 结尾的最大值可能由前面的以arr[i-1]结尾的 最大 负值,最大正数,和arr[i] 产生。例如数组:{2,-3,-4}以-4结尾的最大值,就是3*2=-6,与-4 相乘产生的。

    public static void maxSubProduct(int arr[]){
            if(arr==null||arr.length==0)
                return ;
            int max=arr[0],min=arr[0],maxend,result=0;
            for(int i=1;i<arr.length;i++) {
                //最大值的来源有三种,如果arr[i]是正数,肯定与前面的最大值相乘得到最大值,
                //如果arr[i]是负数就会与前面的最小值相乘产生最大值。如果前面的为0或者负数,
                //arr[i]本身可能是最大值。
                maxend=Max(max*arr[i],min*arr[i],arr[i]);
                //maxend 保存最大值
                min=Min(max*arr[i], min*arr[i], arr[i]);
                //用于保存最小的负值,为下一个最大值最准备
                max=maxend; 
                result=Math.max(result, max);
            }
            System.out.println(result);
        }
    
      public static int Max(int a,int b,int c)
        {
        //返回 a b c 中的最大值
            a=Math.max(a, b);
            a=Math.max(a, c);
            return a;
        }
        public static int Min(int a,int b,int c)
        {
        //返回  a b c 中的最小值
            a=Math.min(a, b);
            a=Math.min(a, c);
            return a;
        }https://blog.csdn.net/u013309870/article/details/70144135

    转自:笔试面试算法经典--连续子数组的最大乘积及连续子数组的最大和(Java)

  • 相关阅读:
    iOS MVC <模型-视图-控制器>
    iOS interface building 大纲视图内容
    循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理 (转载)
    循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储(转载)
    ABP框架中一对多,多对多关系的处理以及功能界面的处理(2)(转载)
    ABP框架中一对多,多对多关系的处理以及功能界面的处理(1)(转载)
    电商商品数据库的设计和功能界面的处理 (转载)
    循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)(转载)
    循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)(转载)
    循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理(转载)
  • 原文地址:https://www.cnblogs.com/heqiyoujing/p/11789403.html
Copyright © 2011-2022 走看看