`
bill600
  • 浏览: 5907 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

一个算法

阅读更多
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

public class FindMaxSubArr {
	public int maxSum;
	public int indexStart;
	public int indexEnd;
	
	/**
	 * 查找和值最大的子数组
	 * 
	 * 如果满足要求则子数组必须满足
	 * 当子数组的长度大于1时,以子数组首个元素开始的,子数组的子数组,和值必须大于等于0
	 * 找出满足这个条件的子数组
	 * 并在其中找出和值最大的
	 * 
	 * 
	 * */

	public void getMaxSubArr(int[] arr) {
		
		 
		 
		if (arr != null && arr.length > 0) {
			int start = 0;
			int end = 0;
			int sum = arr[0];
			maxSum = sum;
			indexStart = start;
			indexEnd = end;
			for (int i = 1; i < arr.length; i++) {
				if (sum < 0) {//sum小于0表示该子数组不符合条件,重新查找下一个符合条件的子数组
					sum = arr[i];
					start = i;
				} else {
					sum += arr[i];//满足条件则继续累加
				}
				end = i;
				if (sum >= maxSum) {//纪录当前和值最大的子数组
					maxSum = sum;
					indexStart = start;
					indexEnd = end;
				}
			}
		}
	}
	
	public static void main(String[] args) {
		int[] arr={1, -2, 3, 10, -4, 7, 2, -5};
		FindMaxSubArr test=new FindMaxSubArr();
		test.getMaxSubArr(arr);
		System.out.println("maxSum="+test.maxSum);
		System.out.println("indexStart="+test.indexStart);
		System.out.println("indexEnd="+test.indexEnd);
	}

}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics