求最大的子数组和,Java实现

问题描述

一个整数数组中的元素有正有负,在该数组中找出一 个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8。问题输入就是一个数组,输出该数组的“连续子数组的最大和”。

想法:看了大多数人的思路,无非分为三种方法:分治法,动态规划,暴力破解(时间复杂度高容易超时)
然后呢就我自己感觉,感觉不是很容易懂,可能是我太笨了QAQ,然后自己写了下,也算是动态规划吧,但是比较容易懂
具体思路:不管是哪一组数组,都会有正有负(当然全负全正也要考虑进去,而且比较容易实现,在这里就不讨论了),就从这组数组里面第一个大于0的1数字开始累加,比sub大的就赋值给sub(最大部分组),小的就继续加。。。中途比较大小,直到数组最后一个值,最终能确定最大的sub。

具体代码:
import java.util.Scanner;

public class Test {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scan.nextInt();
}
System.out.println(f(arr,n));
}

private static int f(int[] arr, int n) {
	int sum = 0;
	int num = 0;
	//判断首个大于零的arr[i]
	while(arr[num]<0) {
		num++;
		if (num == n-1) {
			return 0;
		}
	}
	int sub = arr[num];//暂定sub值为首个大于0的arr[i];
	for (int i = num; i < n; i++) {
		sum += arr[num];
		num++;
		if (sum>sub) {
			sub = sum;
		}
	}
	return sub;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值