zoukankan      html  css  js  c++  java
  • 首尾相连一维数组最大子数组(一)

    一.题目

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

    二.要求

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

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

        如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。 同时返回最大子数组的位置。

        求所有子数组的和的最大值。要求时间复杂度为O(n)

    三.代码

        

    #include <iostream>
    #define N 1000
    using namespace std;
    
    int main ()
    {
        int a[N],n;
        int sum,max;
        int begin,last;
        int i,j,t,k;
        char status = 'y';
    
        while(status == 'Y' || status == 'y')
        {
    
            cout<<"请输入数组长度n:"<<endl;
            cin>>n;
        
            cout<<"请输入"<<n<<"个数:"<<endl;
            for (i=0; i<n; i++)
            {
                cin>>a[i];
            }
    
    //初始化 begin
    = 0; last = 0; max = 0; for (i=0; i<n; i++) { sum = 0; for (j=i; j<n; j++) { sum += a[j]; if ( sum > max ) { max = sum; begin = i; last = j; } }
    for(k=0; k<i; k++) { sum += a[k]; if ( sum > max ) { max = sum; begin=i; last = k; } } } cout<<"最大子数组之和为:"<<endl; cout<<max<<endl; cout<<"最大子数组序列为:"<<endl;
    //当最大子数组出现在首尾相接的情况下 if ( last < begin) { for (i=begin; i<n; i++) { cout<<a[i]<<" "; } for (i=0; i<=last; i++) { cout<<a[i]<<" "; } cout<<endl; } else { for (i=begin; i<=last; i++) { cout<<a[i]<<" "; } cout<<endl; } cout<<endl; cout<<"是否继续(是输入y或Y,否输入n或N):"<<endl; cin>>status; } return 0; }

    刚开始只是考虑了当i=n-1时进行首尾相连的情况,把k的循环放在了外面,只是从i=n-1的时候才开始尾接首从i=0计算最大子数组

    感悟:

    当然在第一遍写完程序的时候不仅仅是没有对max、begin、last进行初始化的问题,都是一些小问题,很容易忽视。但是就是这些小问题导致输出结果错误,在编程的世界里不允许有任何的疏忽出现。所以在以后的编程过程中不仅仅要做到认真还要做到考虑周全

    还待完善:时间复杂度为O(n^2)

    四.测试用例截图

  • 相关阅读:
    《编程之美》
    Fx Composer2.5 在Win8.1下无法运行的解决方法
    纹理坐标的探讨
    随机取两个点 ( 容易犯错的 do while )
    X文件(待续)
    函数指针
    安装DirectX SDK时出现Error Code:s1023 的解决方案(转)
    光与材质
    视棱锥
    D3D支持的图元类型
  • 原文地址:https://www.cnblogs.com/hongyedeboke/p/4417295.html
Copyright © 2011-2022 走看看