• 求元素和最大的子数组2


    1.题目要求:由一中的链状数组变为环状数组

    2.编程思路:

    若数组为环状,将其从a[0]出断开,本质和一条链相同,只不过以前只能按顺序从前面往后相加,环状之后能够从尾部加到头部,所以只需要将此数组长度变为2倍,后面一半的数组元素与前面相同,然后即可按照前面所写的链状相同,只需要在while循环中加上一个限定条件:相加最大数组长度小于二分之一数组长度 即可。

    3.源程序:

    public class Max2 {
    	public static void main(String [] args){
    		int a[]={2,4,3,-9,9,9,-1};
    		int b[]=new int[100];
    		int n=a.length;
    		for(int i=0;i<n;i++){
    			b[i]=a[i];
    			b[i+n]=a[i];
    		}
    		
    		int Max[]=new int[10];
    		Max[0] = 0;
    		int i = 0;//数组下标
    		int j = 0;//最大值数组下标
    		int temp=0;//中间变量
    		int q=1;//用于连续长度的计数
    		while(q<a.length&&i<b.length){			    
    				if(temp+b[i]>=Max[j])
    				{
    					temp=temp+b[i];
    					Max[j]=temp;
    					i++;
    					q++;
    				}
    				else if(temp+b[i]<Max[j]&&temp+b[i]>0)
    				{
    					temp=temp+b[i];
    					i++;
    					q++;
    				}
    				else if(temp+b[i]<=0)
    				{
    				   i++;	
    				   j++;
    				   Max[j]=0;
    				   temp=0;
    				   q=1;
    				}
    			
    		}
    		int max = Max[0];
    		for(int k=0;k<=j;k++){
    			if(Max[k]>max)
    			{
    				max=Max[k];
    			}
    		}
    		/*System.out.println(j);
    		for(int k=0;k<=j;k++){
    			System.out.println(Max[k]);
    		}*/
    		System.out.println("最大子数组和为"+max);
    	}
    
    }
    

    4.运行结果截图:

    学会改变,举一反三,你就能成为智者!

     

  • 相关阅读:
    WHYZOJ-#53 线段树区间修改(线段树)
    洛谷-3373 【模板】线段树 2 (线段树)
    暑假训练-藏妹子之处(递推)
    POJ-1258 Agri-Net(kruskal最小生成树)
    POJ-2559 Largest Rectangle in a Histogram(单调栈)
    BZOJ3439 Kpm的MC密码
    BZOJ3438 小M的作物
    BZOJ3436 小K的农场
    BZOJ3437 小P的牧场
    BZOJ1430 小猴打架
  • 原文地址:https://www.cnblogs.com/xulei11-/p/6641459.html
Copyright © 2020-2023  润新知