zoukankan      html  css  js  c++  java
  • 软件工程课堂一

      通过我们专业大佬的讲解终于懂得了怎么以O(n)的时间复杂度实现这个问题

    思想:我们用一个数组储存以这个数组的第一个整数为开头的子数组的和,那么这个数组的所有子数组都可以通过以这个数组的第一个整数为开头的子数组减去另个以这个数组的第一整数为开头的子数组得到,那么我们只需选取以这个数组的第一个整数为开头的子数组的和的最大值减去以这个数组的第一个整数为开头的子数组的和的最小值(为负值),特殊情况 1,最小值的子数组成员多于最大值子数成员时,我们应该选取最大值的前面的子数组的最小值(小于零)   2,当第一个子数组为最大值时,即这个数组的第一个整数组成的子数组,此时直接输出即可。

    代码如下:

    package test3;
    public class The_first_test {
     public static void main(String[] args) {
      int a[] = { -1, -2,-3, -3, -4, -5 };
      int b[] = new int[a.length]; // 用于储存子数组的最大值
      b[0] = a[0];
      /**
       * 统计所有以一开头的子数组
       */
      for (int i = 1; i < a.length; i++) {
       b[i] = b[i - 1] + a[i];
      }
      int max = b[0];
      int mas, mis;
      mas = mis = 0;
      int min = b[0];
      /**
       * 比较这些子数组里的最大值和最小值
       */
      for (int i = 1; i < b.length; i++) {
       if (max < b[i]) {
        max = b[i];
        mas = i;
       }
       if (min > b[i]) {
        min = b[i];
        mis = i;
       }
      }
      /**
       * 判断最小子数组的成员个数是否大于最大子数组的成员个数
       */
      if (mis > mas) {
       min = b[0];
       mis=0;
       for (int i = 0; i <= mas; i++) {
        if (min > b[i]) {
         min = b[i];
         mis=i;
        }
       }
      }
      /**
       * 判断最小子数组的和值是否小于零
       */
      if(mis!=0)
      {
       if (min <= 0)
        System.out.println("最大子数组的值为" + (max - min));
       else
        System.out.println("最大子数组的值为" + max);
      }else
       System.out.println("最大子数组的值为" + max);
      
     }
    }
  • 相关阅读:
    Linux之文件处理命令
    Linux基础命令
    rip实验
    Linux基础之磁盘分区
    mysql安装
    centos Apache、php、mysql默认安装路径
    You probably tried to upload too large file. Please refer to documentation for ways to workaround this limit.
    Wrong permissions on configuration file, should not be world writable!
    机器会学习么 学习总结
    实验 5 Spark SQL 编程初级实践
  • 原文地址:https://www.cnblogs.com/goubb/p/10507644.html
Copyright © 2011-2022 走看看