zoukankan      html  css  js  c++  java
  • 子数组的和2


    #include<iostream>
    using namespace std;
    #define Nu 100000
    
    int main()
    {
        int a[Nu],k;
    
        cout<<"随机产生数组为:";
        for(int i=0;i<Nu;i++)
        {
            k=rand()%2;
            do 
            a[i]=rand();
            while(a[i]>100);
            a[i]=k==1?a[i]:-a[i];
            cout<<a[i]<<"  ";
        }
        cout<<endl;
    
        int sum=a[0],b=a[0],x=0,y=0;
        for(int i=0; i<Nu; i++)  
        {  
            if(b<0)          
            { b=a[i];x=i;}  
            else  
                b+=a[i];  
            if(sum<=b)  
            {  sum=b;y=i;}  
        } 
    
        cout<<x<<endl<<y<<endl;
        cout<<"相邻子数组最大和为:"<<sum<<endl;
    
        cout<<"相应子数组为:";
        for(int i=x;i<=y;i++)
            cout<<a[i]<<" ";
        cout<<endl;
    
        return 0;
    }
    成员:宋雨佳 周雪莹
    思路:用b来求子数组的和,x用来记录子数组第一个数的地址,从第一个数开始往后加,若b小于0,那么前边数组被舍弃,
    从下一个数开始重新往后计算,x更新到当前位置。sum用来记最后最大子数组的和,y用来记录子数组最后一个数地址,
    每当b大于sum,则sum被更新一次,y更新为当前位置。
    总结:之前的思路无论怎样花间都不能讲时间复杂度改成O(n)所以我们意识到应该是思路不正确,百度来的思路确实很好,但也存在问题,
    这样子的程序是不能处理全是负数的情况的,所以我们又加了输出时,如果x大于y则输出x到y,否则只输出y,这样就解决了全负数问题,
    更改后的程序目前还想不到不足,想到了会及时改进
  • 相关阅读:
    10. Regular Expression Matching
    9. Palindrome Number (考虑负数的情况)
    8. String to Integer (整数的溢出)
    7. Reverse Integer (整数的溢出)
    LeetCode Minimum Size Subarray Sum
    LeetCode Course Schedule II
    Linux 文件缓存 (一)
    LeetCode Tries Prefix Tree
    Linux : lsof 命令
    LeetCode Binary Tree Right Side View
  • 原文地址:https://www.cnblogs.com/xiangwo/p/4387399.html
Copyright © 2011-2022 走看看