题目:
自己写了一种方法,方法很浅显易懂,可是时间复杂度比较高
思路:要想得到largest sum的情况肯定是 子数列的第一个数是正数,最后一个数也是正数。
所以要把数组中所有的正数都找出来,然后把所有从正数开始加到正数结束的情况都计算出sum,返回最大的sum即可。
如果数组中没有正数,则把数组中最大的数返回即可。
public static int maxSubArray(int[] nums) {
List<Integer> list=new ArrayList<>();
int res=0;
int max=0;
//把数组里面所有的正数找出来,存存放到一个列表里面
for(int i=0;i<nums.length;i++) {
if(nums[i]>0) {
list.add(i);
}
}
//如果数组中没有正数
if(list.size()==0) {
max=nums[0];
for(int i=1;i<nums.length;i++) {
if(nums[i]>max) {
max=nums[i];
}
}
return max;
}
//把列表中的每一个数作为子数列的第一个数
for(int i=0;i<list.size();i++) {
int sum=0;
//从当前位置一直往后加
for(int j=list.get(i);j<nums.length;j++) {
sum+=nums[j];
//只有遇到另一个正数 才需要考虑结果是不是最大的
if(nums[j]>0) {
res=sum;
if(res>max) {
max=res;
}
}
}
}
return max;
}
Discuss里面说到分治的方法,没怎么看懂,最后只理解了另一种比较简单的方法
public int maxSubArray(int[] nums) {
//如果数组为空 直接返回0
if (nums == null || nums.length == 0) { return 0; }
//把数组的第一个数赋给max 和sum
int max = nums[0], sum = nums[0];
for (int i = 1; i < nums.length; i++) {
/*如果sum是一个负数 再加上其他的数(无论这个数是正的 还是负的)都不可能是最大的sum
可以想象 就算我加上一个数可以得到最大的sum 那我把前面的负数去掉 sum岂不是更大 所以就直接把这个数赋给 sum
其实这里的思想和我的方法有点类似,就是要sum最大,不可能是“负数” 开头的叠加
*/
if (sum < 0) { sum = nums[i]; }
//如果 sum大于等于0 在此基础上再继续往后加 得到sum 再与max比较
else {sum += nums[i]; }
max = Math.max(max, sum);
}
return max;
}