zoukankan      html  css  js  c++  java
  • 数据结构与算法1——子序列最大问题

    求N个连续数字中子序列最大的和以及起始和结束下标位置

    •  thissum存放当前子序列所求和,当thissum<0,不会使得以后的和变大,则从0重新开始计算新的子序列的和。
    •  每一次更大的thissum都会被替换到新的maxsum中,
    • 如果重新开始的新的子序列的总和大于上一个maxsum,起始位置是min,否则起始位置是minbefore,起始位置未被更新。
    • 算法复杂度O(N)

    代码示例:

    • #include <stdio.h>
      #include <math.h>
      
      void main()
      {
          int a[5]={300,4,-20,80,-34};
          int i,minbefore,min,max,thissum,maxsum;
          max=min=minbefore=thissum=maxsum=0;
          
          for(i=0;i<5;i++)
          {
             thissum=thissum+a[i];
             if(thissum>maxsum)
                  {maxsum=thissum;max=i;}
             if(thissum<0)
             {    if(min<=max)//更新minbefore,始终是当前最大的子序列的起始位置
                  {minbefore=min;}
                  thissum=0;
                  min=i+1;
             }
          }
          printf("从下标%d到下标%d的子序列和最大,是%d",min<=max?min:minbefore,max,maxsum);//min<=max,满足则是新的子序列最大,否则新的子序列不如旧的大,起始位置是minbefore
                  
        
      }
      
       
  • 相关阅读:
    windows下安装mysql教程
    git基本操作
    JDK8,Optional
    重新安装MySQL 8出现的问题
    HTML5学习:缩略图
    HTML5学习:表格
    MySQL常用命令
    Django学习:创建admin后台管理站点
    Django学习:连接Mysql数据库
    Django学习:创建第一个app
  • 原文地址:https://www.cnblogs.com/guoshiyv/p/7020719.html
Copyright © 2011-2022 走看看