zoukankan      html  css  js  c++  java
  • 求数组中的最小子数组,时间复杂度o(n),java

    石家庄铁道大学    信1405-1 班   唐炳辉

    题目:给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。

    设计思路:两个变量 ,一个记录当前并入的数组的值,另外一个记录所算过得最大的数组的值,当并入的值为小于零的时候,就没必要进行继续的相加了,因为再加也不可能比后边单独的数字大,所以,为负数就重新刷新位置,重置子数组的长度重新去找一个新的子数组

     1 //石家庄铁道大学    信1405-1 班   唐炳辉:三藏
     2 /**给定一个数组,求出这个数组中子数组的最大值,求出,要求时间复杂度为O(n)**/
     3  package java_ketang;
     4 import java.util.Scanner;
     5 
     6 
     7  
     8 public class MinArray {
     9 
    10 
    11 
    12 public static void main(String[] args) {
    13     MinArray f = new MinArray();
    14         
    15     //用户自己定义数组的长度并 自行输入一串数组
    16         
    17         Scanner in=new Scanner(System.in);
    18         System.out.print("请输入数组长度:");
    19         int flase0g=in.nextInt();
    20         //输入数组中的各个数值
    21         System.out.print("请依次输入整数:");
    22         int Arr[]=new int[flase0g];
    23         for(int i=0;i<flase0g;i++)
    24         {
    25             Arr[i]=in.nextInt();
    26         } 
    27         //输出用户输入的数组  
    28         System.out.print("您输入的数组为 ");
    29         for(int i=0;i<flase0g;i++)
    30         {
    31             System.out.print(Arr[i]+"  ")  ;
    32         }  
    33         
    34         //输出最后的结果
    35         f.findMaxArr(Arr);
    36     }
    37 
    38     public void findMaxArr(int[] arr) {
    39         int Arr = 0;//用来记录当前并入的数组的和
    40         int MaxArr = 0;//用来记录之前的最大的数组和
    41         int A = arr.length;
    42         int Location1=0;
    43         int Location2=0;//用来记录子数组的最后一个位置
    44         
    45         int i;
    46         
    47 
    48     /**核心算法,两个变量 ,一个记录当前并入的数组的值,另外一个记录所算过得最大的数组的值
    49         当并入的值为小于零的时候,就没必要进行继续的相加了,因为再加也不可能比后边单独
    50         的数字大,所以,为负数就重新刷新位置,重置子数组的长度重新去找一个新的子数组**/
    51         for ( i = 0; i < A; i++) {
    52             Arr += arr[i];
    53             if (Arr < 0) {
    54                 Arr = 0;
    55                 
    56                 
    57                 }
    58             if (Arr > MaxArr) {
    59                 MaxArr = Arr;
    60                 Location2=i;
    61                 ;
    62                 }
    63         }
    64         
    65         //用这个算法,通过最后的位置,和最大值来求出起始位置
    66         for(i=Location2;i>=0;i--)
    67         {
    68             if(MaxArr-arr[i]==0)
    69             {    
    70                 Location1=i;//通过求出来的最大值和最后的那个位置,往前推移,找出起始位置
    71                 break;//跳出循环
    72             }
    73             
    74         }
    75         /**这种情况的出现当且仅当全部的数字都为负数的时候,
    76          对所有的数字求一个最大值就是最大子数组**/
    77         if (MaxArr == 0) {
    78             for ( i = 0; i < A; i++) {
    79                 if (i == 0) {
    80                     MaxArr = arr[i];
    81                 }
    82                 if (arr[i] > MaxArr) {
    83                     MaxArr = arr[i];
    84                 }
    85             }
    86         }
    87         //***************
    88         System.out.println("子数组的长度为"+(Location2-Location1+1));
    89         System.out.println("子数组是由第    "+(Location1+1)+"   个数到第    "+(Location2+1)+"  个数组成");
    90         System.out.println("最大子数组的和是   "+MaxArr);
    91         
    92     }
    93 }

    验证截图

  • 相关阅读:
    Seafile和Nextcloud相比较哪个好用
    opencv3.1+cmake+mingw5.3+QT5编译
    算法导论第三版--动态规划与贪心算法
    Linux 网卡特性配置ethtool详解
    算法导论第三版--红黑树
    算法导论第三版--二叉搜索树
    realloc在aarch64_be-gcc的奇怪表现
    算法导论第三版--桶排序
    算法导论第三版--计数,基数排序
    算法导论第三版--插入排序和归并排序
  • 原文地址:https://www.cnblogs.com/sanzangtdashi/p/5363435.html
Copyright © 2011-2022 走看看