LeetCode之MaxSubArray

博主自己写了一种求数组最大子数列和的方法,该方法易懂但时间复杂度高,思路是找出数组中所有正数,计算从正数开始到正数结束的子数列和,返回最大和,若数组无正数则返回最大数,还提到Discuss里的分治方法没看懂,只理解了另一种简单方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
在这里插入图片描述
自己写了一种方法,方法很浅显易懂,可是时间复杂度比较高
思路:要想得到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;
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值