zoukankan      html  css  js  c++  java
  • 返回一个一维整数数组中最大子数组的和02

    一,要求

    输入一个一维整形数组,数组里有正数也有负数。
    一维数组首尾相接,象个一条首尾相接带子一样。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

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

    二,设计思路

    1,先随机生成一个数组,可以限制上下限的,包括正负数的。初始化当前和的值,最大和的值,还有小组起始和结束的位置,。

    2,循环加和,每次循环比较当前和,与,最大和的大小,当当前和小于0 的时候舍弃当前和,重新定义起始位置为下一次循环的下标值。循环结束时记录小组起始和结束的位置,然后加和输出。

    3,在每一次的循环中加入一个对数组重新排列的操作,就是把第一个位置上的数字放到最后一个位置上,然后其他数字一次放到前面一个的位置上。这样就相当于把数组变成了一个环。

    三,代码

    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    using namespace std;
    #define ARYSIZE 4 //数组大小
    #define MIN -30
    #define MAX 30
    void main()
    {
    	int arry[ARYSIZE];
    	srand((unsigned)time(NULL));//产生随机种子
    	for(int i=0;i<ARYSIZE;i++)
    	{
    		arry[i]=MIN+rand()%(MAX+abs(MIN)+1);
    		cout<<arry[i]<<" ";
    	}
    	cout<<endl;
    	int max=0;//保存最大和
    	int curSum=0;//保存当前和
    	int curStart=0;//当前和的起始位置
    	int start=0;//最大和的起始位置
    	int end=0;//最大和的终止位置
    	int l=0,i,k;
    	for(int i=0;i<ARYSIZE;i++)
            {
                if(arry[i]<0)
                    l+=1;
            }
    	if(l==ARYSIZE)//如果Length个数均为负数
            {
                max=arry[0];
                for(i=0;i<ARYSIZE;i++)
                    if(arry[i]>max)
                    {
                        max=arry[i];
                    }
            }
    	else
    	{
    		max=0;
    		for(i=0;i<ARYSIZE;i++)
    		{
    			k=arry[0];
    			for(i=0;i<ARYSIZE-1;i++)
    			{
    				arry[i]=arry[i+1];
    			}
    			arry[ARYSIZE-1]=k;
    			curSum=0;
    			for(i=0;i<ARYSIZE;i++)
                {
    				if(curSum<0)
                    {
                        curSum=0;
    					curStart=i;
                    }
    				curSum=curSum+arry[i];
                    if(curSum>max)
                    {
                        max=curSum;
    					start=curStart;
    					end=i;
                    }//当前和被保存为最大值,记录下它的起始位置和结束位置
                    
                }
    		}
    	}
    	
    	
    	cout<<"和最大的子数组为:"<<endl;
    	if(start<=end)
    	{
    		for(i=start;i<=end;i++)
    		{
    			cout<<arry[i]<<" ";
    		}
    		cout<<"= "<<max;
    		cout<<endl;
    	}
    	else
    	{
    		for(i=start;i<ARYSIZE;i++)
    		{
    			cout<<arry[i]<<" ";
    		}
    		for(i=0;i<end;i++)
    		{
    			cout<<arry[i]<<" ";
    		}
    		cout<<"= "<<max;
    		cout<<endl;
    	}
    	
    }
    

    四,运行截图

    五,团队照

  • 相关阅读:
    A Bug's Life(削弱版食物链)
    The Suspects
    Find The Multiple
    Lake Counting(dfs)
    经典dfs(depth-first search)
    喝啤酒(预防老年痴呆的深度搜索)
    C语言的位运算的优势 !
    Oil Deposits
    Catch That Cow
    HTML 003 元素
  • 原文地址:https://www.cnblogs.com/420Rock/p/5378459.html
Copyright © 2011-2022 走看看