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

    关于这个程序是我的第一个作为团队的一员开发的项目,体会较深的是团队开发不同于自己一个人开发,要同时顾及到团队成员的感受,以及要对自己的代码进行一定的规范方便其他成员的理解,而且,我感觉最开始的团队合作是有点困难的,只是刚刚在一起会有不少矛盾,也许是因为每个人都习惯了自己单独开发,而且值得注意的是,多人开发的时候会出现分工不明确的事情,就现在来说,感觉还是在自己一个人开发,同时都去写这个程序,并没有真正的合作,还是各顾各的。以上是这次写这个小程序自己的一些体会。

    下边关于这个程序,最开始的想法是在给一个给定的数组,先找出第一个非负的数据并确定其下标,在一次相加,用一个int型变量result来记录和的值,用max来记录最大值,在用string类型的变量output来记录参与相加的数据下标的,result与max进行比较,当result大于max时将result值赋给max,同时定义一个String类型的变量out用来记录此时的output值,这样就实现了在时间复杂度为O(n)的条件下找出最大子数组及和。这里存在的问题是max值最先赋值为0,所以需要在全为负数的时候进行判断result的值若为0,依次比较大小找出其中最大的一个。代码如下

    import java.util.Scanner;
    
    public class Hechaxun {
    	static Scanner str=new Scanner(System.in);
    	public static void main(String args[])
    	{
    		int shuzu[]={-1,3,-3,2,-1,1,4,5,-1};
    		judge(shuzu);
    	}
    	public static void judge(int shuzu[])//最大的子数组
    	{
    		int max = 0;
    		int result = 0;
    		int index=0;
    		String output="";
    		String out="";
    		for(int i=0;i<shuzu.length;i++)
    		{
    			if(shuzu[i]>=0)
    			{
    				index=i;
    				break;
    			}
    		}
    		for(int i=index;i<shuzu.length;i++)
    		{
    			result=result+shuzu[i];
    			output=output+""+i;
    			if(result<0)
    			{
    				result=0;
    				output="";
    			}
    			if(result>max)
    			{
    				max=result;
    				out=output;
    				System.out.println(max);
    			}
    		}
    		System.out.println(out);
    		System.out.println(max);
    	}
    	
    }
    

      上边是一段用于调试的代码;

    接下来是将上述的数组变为一个循环数组的代码,具体的思想是建立在以上代码的基础上,在定义一个长度为2n-1的数组shuzu2,来实现所谓的循环数组,就是将存放初始值的数组通过for套for的循环方式赋值给新定义的shuzu2中,在通过上述思想去找最大值代码如下

    public class Hechaxun {
    	public static void main(String[] args)
    	{
        	int a[]={-3,-1,-2,-1,-4,-8};
        	System.out.println("最大子数组的值为:"+findMaxSum(a));
    	}
    	public static int findMaxSum(int[] arr) 
    	{
    		int curSum = 0;
    		int maxSum = 0;
    		int len = arr.length;
    		int start = 0;
    		int end = 0;
    		int[] begin = new int[len*2-1]; 
    		int[] arrcir = new int[len*2-1];
    		for(int i=0;i<len;i++)
    		{
    			arrcir[i] = arr[i];
    		}
    		
    		for(int i=0;i<len-1;i++)
    		{
    			arrcir[len+i] = arr[i];
    		}
    		
    		if (arr == null || len == 0) {
    			System.out.println("数组为空!!!");
    		}
    
    		
    		for(int i=0;i<len;i++)
    		{
    			curSum = arr[i];
    			if(arr[i]>=0)
    			{
    				start = i;
    				for (int j = i+1; j <len+i; j++)
    				{
    					curSum += arrcir[j];
    					if (curSum < 0)
    					{
    						curSum = 0;
    						start = j;
    					}
    					if (curSum >=maxSum) 
    					{
    						maxSum = curSum;
    						end = j;
    						begin[j] = start;
    					}
    				}
    			}
    		}
    		
    		String out = "";
    		System.out.println(start+" "+end);
    		for(;begin[end] <= end;begin[end]++)
    		{
    			out = out + " "+arrcir[begin[end]];
    		}
    		System.out.println("最大子数组为: "+out);
    		// all data are negative
    		if (maxSum == 0) {
    			for (int i = 0; i < len; i++) {
    				if (i == 0) {
    					maxSum = arr[i];
    				}
    				if (arr[i] > maxSum) {
    					maxSum = arr[i];
    				}
    			}
    		}
    		return maxSum;
    	}
    }
    

      

  • 相关阅读:
    数据流的小结
    二分法小结
    k倍区间
    【图文并茂】如何将英文版的Altium Designer Winter 09改成汉语版?
    【PCB操作】PCB拼板
    【图文并茂】如何将库文件移到另一个库
    PCB的收尾工作之补泪滴
    uCOS-II 学习笔记--------OSInit函数
    uCOS-II 学习笔记之任务管理--------任务就绪表和就绪组
    [leedcode 205] Isomorphic Strings
  • 原文地址:https://www.cnblogs.com/yuezhihao/p/6653130.html
Copyright © 2011-2022 走看看