leetcode第53题,此题用暴力能做出结果但是显然过不了,因为时间复杂度太高了。
当然其它的做法也有很多,最简单的方法还是用数学的方法。
先上思路。
遍历数组,先定义一个最大的数,让第一个数和它相加,如果相加的结果是负数,则把最大子列和maxSize置为0,若是正数则先保存在curSize里面,对后续的遍历,若结果为负一样的将结果curSize置为0,若为正数,且curSize大于之前保存的maxSize则将maxSize置换。
另外就是如果子列全都是负数的情况,需要重新做判断,返回值应该是负数最大的那个。
{-2,1,-3,4,-1,2,1,-5,4}
对于这个数组,第一次cursize=-2,为负数,则将,cursize置为0;
第二次,cursize为0+1=1,maxsize<cursize,则将maxsize为1;
第三次,cursize为1+(-3)=-2,则将cursize置为0,maxsize依旧为1;
第四次,cursize为4,且maxsize<cursize,则将maxsize为4;
第五次,cursize为4+(-1)=3,maxsize依旧为4;
第六次,cursize为3+2=5,且maxsize<cursize,则将maxsize为5;
第七次,cursize为5+1=6,且maxsize<cursize,则将maxsize为6;
第八次,cursize为6-5=1;maxsize依旧为6;
第九次,cursize为1+4=5;maxsize依旧为6;
遍历完成将maxsize=6值返回;
另外一种情况若数组都是负数,则将数组最大的元素返回就可;
附上代码
package leetcode;
public class Demo {
public static void main(String[] args) {
int[] arr1 = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int[] arr2 = {-1, -2, -6, -9};
System.out.println(maxSubArray(arr1));
System.out.println(maxSubArray(arr2));
}
public static int maxSubArray(int[] nums) {
int maxSize = 0; //保存最大子列和
int curSize = 0; //保存当前子列和
int max = nums[0]; //保存数组最大的数
int temp;
for (int i = 1; i < nums.length; i++) {
if (max < nums[i]) {
max = Math.max(max, nums[i]);
}
}
if (max < 0) { //判断数组全为负数,只需要判断最大数是不是负数,是的话就返回最大负数就是最大子列和
return max;
} else {
for (int i = 0; i < nums.length; i++) { //数组有正数有负数情况
curSize += nums[i];
if (curSize < 0) {
curSize = 0;
}
if (curSize > maxSize) {
maxSize = curSize;
}
}
return maxSize;
}
}
}