• 返回一个整数数组中最大子数组的和3


    题目:返回一个整数数组中最大子数组的和3

    要求:

           输入一个整形数组,数组里有正数也有负数。

          数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

          如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。

          同时返回最大子数组的位置。

          求所有子数组的和的最大值。

    思路:利用for循环实现首位相连

    代码:

    #include<iostream>

    #include<time.h>

    #include <stdio.h>

    #include <stdlib.h>

    using namespace std;

      int max_subarray_bound(int a[],int from,int to)

    {    

          int i,max,sum;        

          max = a[from];    

          sum = a[from];        

         for(i = from + 1;i <= to;i++)  

    {         if(sum < 0)            

                     sum = 0;        

                     sum += a[i];        

               if(max < sum)            

                    max = sum;    

    }

        return max;

    }

    int max_subarray_cycle(int a[],int size)

    {     int sum,i,j,s,m;          

    sum = max_subarray_bound(a,0,size-1);    

        if(size == 2) return sum;

        i = 1;     j = size-2;

        s = a[i-1] + a[j+1];        

       while(i < j && (a[i] >=0 || a[j] >= 0))  

    {         if(a[i] >= 0)   

                 {            

                          s += a[i];            

                            i++;        

                }                

            if(a[j] >= 0)   

                {             s += a[j];            

                               j--;        

               }    

      }        

           if(i == j)  

               {        

                      if(a[i] >0)  

                             s+=a[i];        

                     if(s < sum)

                              return sum;        

                     else return s;    

              }        

            if(i < j)  

                {            

             int s2,k;        

              m = a[i];        

              s2 = m;        

             for(k=i+1;k <= j;k++)   

                    {            

                         s2 += a[k];            

                        if(m < s2)                

                        m = s2;        

                  }                

                  s2 = a[j];        

                 for(k = j-1;k>=i;k--)  

                      {               s2 += a[j];            

                                      if(m < s2)                

                                                    m = s2;        

                    }                

                     if(m > 0)            

                           s += m;    

        }        

      if(s < sum)

               return sum;    

       else return s;    

    }

    int main(int argc,char *argv[])

    {    

     int num,*a;  

    cout<<"请输入以为数组的长度:";  

    cin>>num;  

    a = new int [num];    

    srand((unsigned)time(NULL));    

    for(int i=0;i<num;i++)   

    {      a[i]=rand()%100-25;     

            cout<<a[i]<<"  ";      

    }  

        cout<<endl;    

         cout<<"环形一维数组子数组和的最大值:  "<<max_subarray_cycle(a,num)<<endl;    

       delete a;     

        return 0;

    }

    截图:

    总结:刚开始用的是课堂上说的那种方法,但是还是没有做出来还是在网上找的例子

  • 相关阅读:
    安装django时出错
    mysql ------python3(一)笔记
    安装mysql的具体过程
    Python3web框架---Django、Tornado、Flask的对比
    python3-----json函数
    图片人脸识别年龄和性别
    urllib库的使用(三)-----python3 异常处理
    python 3 基础篇 (一)
    requests,pymysql,django的安装
    求素数方法的改进
  • 原文地址:https://www.cnblogs.com/mingning/p/4537649.html
Copyright © 2020-2023  润新知