zoukankan      html  css  js  c++  java
  • 找一个数组的最大和的连续子数组(时间复杂度 O(n))

    设计思想

    一开始的思想是求出全部的情况,再分别比较大小,这种方法适用于有限个数组,不适用于输入数组长度和内容的情况。

    但也试着做了

     1 int a[]= {-1,2,6,-10};
     2         int size=4;
     3                 int maxa=a[0];
     4         for(int i=0;i<size;i++) {
     5             if(maxa<a[i])
     6                 maxa=a[i];
     7         }
     8         //对于两个数一组
     9         int b[]=new int[size-1];  
    10         for(int i=0;i<size-1;i++) {
    11             b[i]=a[i]+a[i+1];
    12         }
    13         //再遍历b数组
    14         int maxb=b[0];
    15         int sizeb=size-1;
    16         for(int i=0;i<sizeb;i++) {
    17             if(maxb<b[i])
    18                 maxb=b[i];
    19         }
    20         //对于三个数一组
    21         int c[]=new int[size-2];
    22         int sizec=size-2;
    23         for(int i=0;i<sizec;i++) {
    24             c[i]=a[i]+a[i+1]+a[i+2];
    25         }
    26         //再遍历c数组
    27         int maxc=c[0];
    28         for(int i=0;i<sizec;i++) {
    29             if(maxc<c[i])
    30                 maxc=c[i];
    31         } 
    32         //对于四个数一组
    33         int maxd=0;
    34         for(int i=0;i<size;i++) {
    35             maxd=maxd+a[i];
    36         }
    37         
    38         //比较这些组合的大小
    39         int max1=0;
    40         int max2=0;
    41         int max=0;
    42         if(maxa>maxb) {
    43             max1=maxa;
    44         }else {
    45             max1=maxb;
    46         }
    47         if(maxc>maxd) {
    48             max2=maxc;
    49         }else {
    50             max2=maxd;
    51         }
    52         if(max1>max2) {
    53             max=max1;
    54         }else {
    55             max=max2;
    56         }
    57         System.out.println("连续子数组的最大值为:"+max);                 

    这种方法比较傻,下面是我参考了网上的之后自己动手解决的。

    设计思想:

    把最大值sum赋值为0,curr是当前数值,curr=curr+下一个数  依次类推,若curr为负数,就让curr

    为0,否则就判断sum和curr的大小关系,sum=较大的那个数。

     1         Scanner sc=new Scanner(System.in); 
     2         //定义数组长度和数组
     3         //输入数组长度
     4         System.out.println("请输入数组的长度:");
     5         int size=sc.nextInt();
     6         int a[]=new int[size];
     7         int sum=0;
     8         int curr=0;
     9         
    10         
    11         //输入数组的内容
    12         System.out.println("请输入数组内容:");
    13         for(int i=0;i<size;i++) {
    14             a[i]=sc.nextInt();
    15         }
    16         
    17         
    18         //有负有正
    19         for(int i=0;i<size;i++) {
    20             curr=curr+a[i];
    21             if(curr<0) {
    22                 curr=0;
    23             }else {
    24                 if(sum<curr) {
    25                     sum=curr;
    26                 }else {
    27                     sum=sum;
    28                 }
    29             }
    30         }
    31         //若全是是负数
    32         if(sum==0) {
    33             int sum1=a[0];
    34             for(int i=0;i<size-1;i++) {
    35                 if(sum1>a[i+1]) {
    36                     sum1=sum1;
    37                 }
    38                 else {
    39                     sum1=a[i+1];
    40                 }
    41             }
    42             sum=sum1;
    43         }
    44         
    45         System.out.println("连续子数组的最大值为:"+sum);

    全是负数的情况

    遇到的问题:

    1,最开始没有比较curr和sum的大小关系,而直接让sum=curr,会导致sum为最后一个为正的数

    2,忘记考虑全是负数的情况,导致全为负数,sum的值=0。

    总结:

    在设计此类题的时候,要考虑周到,在时间复杂度为o(n)的条件下,把各种情况都要考虑到。

    还要多尝试,写出来代码出错后要一步一步推敲错在哪里,分析分解,再锁定错的地方,是解决问题的关键。

  • 相关阅读:
    C# 递归查找树状目录
    C#递归计算树形菜单
    使用StringBuilder写XML遭遇UTF-16问题
    Error: 'The service did not respond in a timely fashion'
    no suitable method found to override
    Could not load file or assembly "win32_x86dotnet1crdb_adoplus.dll' or one of its dependencies.
    Unable to find the requested .Net Framework Data Provider
    Call JMS Web Service
    Remove Mapping
    卸载windows服务
  • 原文地址:https://www.cnblogs.com/xcl666/p/10499751.html
Copyright © 2011-2022 走看看