• java实现最大连续和问题


    
    /*
       10 5 -3 12 -31 15 22 -7 6 -8 -9 10 ....
       暴力:O(n^3)
       分治:[      mid   )  三种情况求最大
       基线法: O(n)
          2个数组:
          从左到本位:出现的最大累加
          从左到本位:累加的最小值
          
       网搜:最大连续和
    */
    
    
    public class A
    {
    	// 对a, [p,q) 区间求最大连续和
    	public static int g(int[] a, int p, int q)
    	{
    		if(q-p==1){
    			if(a[p]>0) return a[p];
    			return 0;
    		}
    		
    		int mid = (p+q)/2;
    		
    		int max = 0;
    		int m1 = g(a,p,mid);
    		if(m1>max) max = m1;
    		
    		int m2 = g(a,mid,q);
    		if(m2>max) max = m2;
    		
    		// 中间向左扩展搜索
    		int m3a=0;
    		int sum = 0;
    		for(int i=mid; i>=p; i--){
    			sum += a[i];
    			if(sum>m3a) m3a = sum;
    		}
    		
    		// 中间向右扩展搜索
    		int m3b=0;
    		sum = 0;
    		for(int i=mid+1; i<q; i++){
    			sum += a[i];
    			if(sum>m3b) m3b = sum;
    		}
    		
    		int m3 = m3a + m3b;
    		if(m3>max) max = m3;
    		
    		return max;
    	}
    	
    	public static int f(int[] a)
    	{
    		int max = 0;
    		for(int i=0; i<a.length; i++)
    		for(int j=i+1; j<a.length+1; j++){
    			int sum = 0;
    			for(int k=i; k<j; k++) sum += a[k];
    			if(sum > max) max = sum; 
    		}
    		return max;
    	}
    	
    	
    	public static void main(String[] args)
    	{
    		final int N = 2000; 
    		
    		int[] a = new int[N];
    		
    		for(int i=0; i<a.length; i++){
    			a[i] = (int)(Math.random() * 100) - 50;
    		}
    		
    		System.out.println(f(a));
    		System.out.println("-----------------------");
    		System.out.println(g(a,0,a.length));
    	}
    }
    
  • 相关阅读:
    Js 循环 forEach, map, for, for...in, for...of
    es6 let const
    es6 Symbol类型
    es6 Reflect 与 Proxy
    es6 Map&Set
    es6箭头函数
    es6数组Arrary
    学写网站(一)前端配置之安装nvm、node、npm
    python获取当前执行代码所在文件的地址、主程序所在地址
    scrapy中的选择器下载中间件downloadmiddlewares
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13076934.html
Copyright © 2020-2023  润新知