• 环状数组最大子串和 最大和最小是相对的


    要知道,最大和最小是相对的,用总和减去最小的就能得到最大的。     编程之美的题目没看懂,然后参考了http://zhangpeizhen.blog.163.com/blog/static/231873112201431784024921/

    两种情况

    1、普通数组,可以o(n)求最大子串和。

    2、如果是环状,那么则要看到跨越 n-1 到 0 的这段环状的情况,要求这段最大的和,只需要用总和减去非环状的最小子串和即可。

    然后取两种情况的最大值即可。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<string>
    using namespace std;
    
    void dp() {
       int i,t1,t2;
       t1 = arra[0];
       t2 = arra[0];
       Max = t1;
       Min = t2;
       for( i = 1 ; i < n ; i ++)
       {
          if(t1 <= 0)
             t1 = arra[i];
          else
             t1 += arra[i];
          if(t2 >= 0)
             t2 = arra[i];
          else
             t2 += arra[i];
          Max = max(t1,Max);
          Min = min(t2,Min);
       }
       Max = max(Max,total-Min);
       printf("%d
    ",max(Max,0));
    }
     
    int main() {
       while(~scanf("%d",&n))
       {
          total = 0; 
          for(int i = 0 ; i < n ; i ++)
          {
             scanf("%d",&arra[i]);
             total += arra[i];
          }
          dp(); 
       }
       return 0;
    }

    但是我觉得少考虑了一种情况,比如全部为-1的数组,

    普通数组最大子串和为-1,

    按照上面求的最大的环状的必然为0,但是这样就是什么都不取的状态,

    所以我觉得最后需要判断 是否 最小子串和 与 整个数组和 相等,如果相等说明就是上面考虑的情况,那么就取普通数组的的最大子串和就行了。

  • 相关阅读:
    20200721_34代码如何优化以及框架的运用和构建设计
    20200719_33appium应用及H5页面元素定位下
    20200709_29多线程与分布式
    day4_day4_python
    python_day3
    python第二天
    pytihon初学第一天
    移动平均线系列
    网页爬取
    十种经典排序算法
  • 原文地址:https://www.cnblogs.com/juandx/p/4056676.html
Copyright © 2020-2023  润新知