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;
    	}
    }
    

      

  • 相关阅读:
    215. Kth Largest Element in an Array
    214. Shortest Palindrome
    213. House Robber II
    212. Word Search II
    210 Course ScheduleII
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    206. Reverse Linked List
    sql 开发经验
  • 原文地址:https://www.cnblogs.com/yuezhihao/p/6653130.html
Copyright © 2011-2022 走看看