JAVA 实现循环数组的最大在、连续子数组的和

原创 2018年04月15日 15:56:18

剑指Offer上有类似的题目:

-------------->求数组连续子数组的最大和为多少?

-------------->求循环数组连续子数组的最大和为多少?

数组好说 判断之前节点的sum < 0;没必要拿本数,去还债,直接设置sum=a[i];依次循环 

【重点max 最开始要被初始化为 Integer.MIN_VALUE】

循环数组:关键在于,找到的sum 有两种可能的情况:

1.sum 是由首尾之间的子数组构成的;

2.sum 由尾部分+首部分构成,抛弃了中间一部分数组。为什么中间被抛弃:因为他们的和是负数,且是和最小的部分。

但是循环数组会有一个问题,如果全部为负,1得到的一定是最大的那个负数,2.会得到0,那么最后会输出0.所以要避免。

情况1,和数组方法一样;

情况2的重点在于:找到中间部分->对数组求导找到maxsum,就是反数的min部分。然后用数组总和SUM-(-maxsum);

连续数组最大和:

public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        int flag = 0; int cursum = 0; int result = 0x80000000;
        //32位int范围(0x80000000,0xFFFFFFF)~(0,0x7FFFFFFF)
        for(int i = 0;i<array.length;i++){
            if(cursum <=0){
                //cursum = 0;//错误
                cursum = array[i];
            }
            else{
                cursum += array[i];
            }
            if(cursum > result)
                result = cursum;
        }
        return result;
    }
}

循环数组的连续子数组的最大和:

public class Main {
	private static  int max = Integer.MIN_VALUE;
	public static void main(String[] args) {
		int[] a={-3,-1,0,-6,-2};int n=a.length;
		int[]b=new int[n];int sum=0;
		//第一种情况,正常,最大max数组的取值在首尾之间
		boolean allfushu=true;
		for(int i=0;i<n;i++){
			if(a[i]>=0)
				allfushu=false;
		}
		int sum1=find(a,n);
		 //第二种情况,部分头+部分尾;中间部分没选择,因为他们的sum最小且为负
		//所以才启发了思路去找没被选中的中间部分:将数组取反 重新找max
		for(int i=0;i<n;i++){
			b[i]=-a[i];
			sum+=a[i];//sum是数组总和
		}
		if(!allfushu){
			int temp = find(b,n);
			int sum2 = sum+temp;
			//这里少考虑一种情况:数值全为负的时候,循环数组的最大子数组的和 
			//第一种算出来是-1,而第二种算出来为0,如果不允许是空串的话应该最后结果为-1的
			//所以这里最好加一个判断,如果全为负直接用第一种就行,不要第二种判断了,否则会导致出错。			
			max = Math.max(sum1, sum2);
			System.out.print(max);
		}
		else {
			System.out.print(sum1);
		}
		
	}
	public static int find(int[]a,int n){
		if(a==null)
			return 0;
		int sum =a[0];	int max1=max;
		for(int i=1;i<n;i++){		
			if(sum<=0)
				sum=a[i];
			else 
				sum+=a[i];
			max1 = max1<sum?sum:max1;
		}
		return max1;
	}


}

剑指Offer: (Java实现) 连续子数组的最大和

* 类说明:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,...
  • leadershanzhi
  • leadershanzhi
  • 2017-06-13 12:07:07
  • 295

连续子数组的最大和 java实现

题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如...
  • qq_23217629
  • qq_23217629
  • 2016-09-11 20:25:49
  • 1078

动态规划典型例题--连续子数组的最大和

题目描述:给定一个数组arr,数组中的元素有整数也有负数,数组中的一个或者连续多个数组成一个子数组。 求所有子数组里面的最大和。例如现在有数组 {1 , -2 , 3 , 10 , -4 , 7...
  • qq_34528297
  • qq_34528297
  • 2017-05-24 19:27:09
  • 3277

Java编程----连续子数组的最大和

本篇博客的编程是关于数组的,数组在编程中有着举足轻重的地位,因为在Java中数组是直接存储在栈中的,所以操作起来很方便,效率非常高,数组也是面试中经常考察的一部分,关于数组的编程题目丰富多样,逻辑性很...
  • sd_lucky
  • sd_lucky
  • 2016-08-04 23:09:37
  • 3294

循环数组的最大子段和

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050   题意:给定一个长度为50000的数组,求它的循环数组...
  • ACdreamers
  • ACdreamers
  • 2014-08-22 19:41:38
  • 3170

剑指offer----连续子数组的最大和----java实现

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数...
  • snow_7
  • snow_7
  • 2016-07-17 23:52:06
  • 803

面试题31:连续子数组的最大和(java)

package findMax; /** * 连续子数组的最大和 * @author root * */ public class FindMax { static int[] data ...
  • Yan456jie
  • Yan456jie
  • 2016-03-05 13:44:09
  • 568

连续子数组的最大和问题(一维和二维)To the Max (POJ 1050)

一维数组的连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 这是一个典型的D...
  • huanyingtianhe
  • huanyingtianhe
  • 2015-01-25 16:35:33
  • 1341

循环数组求最大子段和系列-----------方法1

Equator Time Limit: 2000ms, Special Time Limit:5000ms, Memory Limit:65536KB Total submit users: ...
  • ruangongshi
  • ruangongshi
  • 2015-03-22 11:27:42
  • 1234

找出无序数组的最长连续子数组

有这样一个数组,[-4, -3, -2, -1, 2, 3, 5, 6, 7, 9, 12, 33, 35],找出它的最长连续子数组,如这个数组的最长连续子数组是-4, -3, -2, -1。 我的...
  • mirror_young
  • mirror_young
  • 2017-08-04 13:59:18
  • 226
收藏助手
不良信息举报
您举报文章:JAVA 实现循环数组的最大在、连续子数组的和
举报原因:
原因补充:

(最多只允许输入30个字)