zoukankan      html  css  js  c++  java
  • 最大子数组

     要求:
    1.要求程序必须能处理1000 个元素;
    2.每个元素是int32 类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;
    3.输入一个整形数组,数组里有正数也有负数。
    4.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    5.求所有子数组的和的最大值。要求时间复杂度为O(n)。
    Int类型溢出:
    当两个操作数都是有符号数时,溢出就有可能发生。而且溢出的结果是未定义的。当一个运算的结果发生溢出时,任何假设都是不安全的。
    例如,假定a和b是两个非负的整型变量(有符号),我们需要检查a+b是否溢出,一种想当然的方式是:
    if (a + b < 0)
          溢出;
    实际上,在现实世界里,这并不能正常运行。当a+b确实发生溢出时,所有关于结果如何的假设均不可靠。比如,在某些机器的cpu,加法运算将设置一个内部寄存器为四种状态:正,负,零和溢出。在这种机器上,c编译器完全有理由实现以上的例子,使得a+b返回的不是负,而是这个内存寄存器的溢出状态。显然,if的判断会失败。一种正确的方式是将a和b都强制转换为无符号整数:
    if ( (unsigned)a + (unsigned)b  > INT_MAX)
          溢出;
    这里的int_max值为有符号整型的最大值。在一般的编译器里是一个预定义的常量。ANSI C在limits里定义了INT_MAX,值为2的31次方-1. 不需要用到无符号算数运算的另一种可行方法是:
    if (a > INT_MAX - b )      溢出;
    通过此次学习,学会了int *p=new int[n];开辟动态储存空间。满足输入动态数组的要求。用rand()%1000-500产生在-500到500之间的1000个数。用if(p[i]>(INT_MAX-sum))判断int型是否溢出判断子数组最大的步骤:
    从一个正数开始

    加上后一个数,和之前的和比较大小,如果变大就加上,如果变小就重新开始新的起点。
    3.对i的变化表示了开始和结束的标致点。
    一、第一次处理1000个元素 
    #include<iostream>
    #include<stdlib.h>
    #include <time.h>
    using namespace std;
    int main()
    {
      int n=1000,star=0,end=0;

      int *p=new int[n];
      srand((unsigned)time(NULL));
      for(int i=0;i<n;i++)
      {
          p[i]=rand()%1000-500;
      }

      for(int i=0;i<n;i++)
      {
          cout<<p[i]<<" ";
          if((i+1)%10==0)
          {
              cout<<endl;
          }
      }
      int sum=p[0];
      int max_sum=p[0];

      for(int i=1;i<n;i++)
      {
          if(sum>0)
          {
              if(p[i]>(INT_MAX-sum))
              {
                  cout<<"int error"<<endl;
                  return 0;
              }
              sum=sum+p[i];
             if(sum>max_sum)
               {
                   max_sum=sum;
                   end=i;
               }
          }
          else
          {
              sum=p[i];
                 if(sum>max_sum)
                 {
                    max_sum=sum;
                    star=i;
                    end=i;
                 }
          }
      }
      cout<<"from "<<star+1<<" to "<<end+1<<endl;
      cout<<"the sum of the max array:"<<max_sum<<endl;
      return 0;
    }

    学会了int *p=new int[n];开辟动态储存空间。满足输入动态数组的要求。
    用rand()%1000-500产生在-500到500之间的1000个数。
    用if(p[i]>(INT_MAX-sum))判断int型是否溢出
    判断子数组最大的步骤:
    1.从一个正数开始
    2.加上后一个数,和之前的和比较大小,如果变大就加上,如果变小就重新开始新的起点。
    3.对i的变化表示了开始和结束的标致点。

  • 相关阅读:
    【内存管理】STL空间配置器
    【关键帧提取】基于CSD特征
    【内存管理】内存池技术
    【CUDA学习】计时方法
    【内存管理】简单的分配程序(续1)
    【背景建模】基于时空特征(续1)
    【OpenCV学习】准确定位帧
    【背景建模】基于时空特征(续2)
    【内存管理】简单的分配程序
    32位asp.net应用程序在64位Windows上运行时的问题一例
  • 原文地址:https://www.cnblogs.com/sjztd-slx/p/9787768.html
Copyright © 2011-2022 走看看