• 【C】课堂结对联系-求整数数组的子数组之和的最大值(党云龙、黄为)


      • 测试题目
        求整数数组的子数组之和的最大值。
      • 题目分析
        首先是明确题目的目的:求最大值;其次是考虑子数组求和。这里将求最大值写成一个单独的函数。主函数未测试函数。这里用到了二重循环,时间复杂度为N^2.
      • 源代码分析
        复制代码
        #include"stdio.h"
        #define MAXSIZE 100
        /*int Max(int num[],int length) { int max=num[0]; //int n; int sum=0; int flag=0; for(int j=0;j<length;j++) { if(max<num[j]) max=num[j]; } for(int k=0;k<length-1;k++) { if(max<(num[k]+num[k+1])) max=(num[k]+num[k+1]); } for(int m=0;m<length-2;m++) { if(max<(num[m]+num[m+1]+num[m+2])) max=(num[m]+num[m+1]+num[m+2]); } for(int n=0;n<length-3;n++) { if(max<(num[n]+num[n+1]+num[n+2]+num[n+3])) max=(num[n]+num[n+1]+num[n+2]+num[n+3]); } for(int z=0;z<length-4;z++) { if(max<(num[z]+num[z+1]+num[z+2]+num[z+3]+num[z+4])) max=(num[z]+num[z+1]+num[z+2]+num[z+3]+num[z+4]); } if(max<(num[0]+num[1]+num[2]+num[3]+num[4]+num[5])) max=(num[0]+num[1]+num[2]+num[3]+num[4]+num[5]); return max; }*/ int Max(int num[],int length) { int max=num[0]; if(length<=0) { printf("数组个数为零或负数,错误,默认MAX设为0"); return 0; } for(int k=0;k<length;k++) { if(num[k]==-858993460) { printf("数组含为NULL,错误,默认MAX设为0"); return 0; } } for(int i=0;i<length;i++) { int sum=0; for(int j=i;j<length;j++) { sum+=num[j]; if(max<sum) max=sum; } } return max; } main() { //int num[]={-10,-12,1,-1,9,10}; //int length=6; int num[MAXSIZE]; int length; printf("输入数组个数:"); scanf("%d",&length); for(int x=0;x<length;x++) scanf("%d",&num[x]); /*for(int i=0;i<6;i++) printf("%d ",num[i]);*/ printf(" "); printf("MAX:%d ",Max(num,length)); }
        复制代码

        这里我进行了一些异常情况的处理






      • 上课思路
        上课的随手乱画
      • 扩展-线性实现
        如何利用线性实现,首先要对整形数组进行分析:
        1、零对于和没有影响。
        2、数组是全负的情况(若只有负数和零,则max=0)
            
        for(int i=0;i<length;i++)
        {
            if(max<num[i])
                max=num[i];    
        }

        3、数组是全正的情况(含0)
         

        for(int i=0;i<length;i++)
        {
            if(max<num[i])
                max=num[i];    
        }

        4、有正有负的情况
             首先是要顺序寻找第一个大于零的整数,记录下来数组下标,然后接着寻找下一个负数,得到负数段,也求和,得到一段正数段,求和,按照这种方法遍历整个数组。
             对这些正数段与负数段进行判断与求和,从而实现求出最大者。

      • 线性实现
             待下回分解!

  • 相关阅读:
    用户登录就显示一部分按钮,未登录就显示登录按钮
    网页防止xss攻击
    前端页面使用编辑器
    Django框架
    参数*args与**kwargs
    Django的orm需要注意的地方
    查看Linux服务器配置命令
    PHP 浅析spl_autoload_register
    ubuntu服务器上安装PHP扩展bcmath遇到的问题Sub-process /usr/bin/dpkg returned an error code (1)
    JavaScript 变量and函数提升机制
  • 原文地址:https://www.cnblogs.com/huang-wei/p/3592740.html
Copyright © 2020-2023  润新知