每日一题:Leetcode53 最大子数组和

文章目录

系列:贪心算法专练
语言:java
题目来源:leetcode53 最大子数组和
难度:中等
考点:贪心算法思路和理解 && 暴力算法


题目描述

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。

示例 1:>输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:> 输入:nums = [1]输出:1****提示:> 1 <= nums.length <= 105-104 <= nums[i] <= 10^4

一、思路两种思路:

暴力法 和 贪心算法(会用dp的小伙伴可以尝试用dp解决,这里只讲述这两种思路)暴力法:当我们拿到这个题的时候,入眼可见的可以使用暴力,本题可以使用两层for循环完美解决,但是根据题中题目限制,时间复杂度不满足条件,肯定会超时;分析如下:题中限制长度:1 <= nums.length <= 105,两层for循环数据来到108,而两层for循环只能处理5000左右数据,所以肯定超时,但是可以用暴力锻炼我们的思路,参考代码如下;贪心算法:贪心算法没有模板,主要考验的是我们的解题思路;对于本题,如何做到局部最优,使用一层for循环进行遍历,就是连续和大于0,那么当连续和小于0时,我们应该记录下为0前的区间和,然后在i+1处,重新开始计算区间,最后进行多个区间比较大小,找出最大的区间和;举例:3 -5 3 1 -3 -1当i=0时 ,num =3 ;当i=1时,num =-2; 此时连续和小于0,那我们就用result 记录下此时连续和为0前的区间和为3;此时头部是从i=0,3开始的,结束此区间,将头部从-5下一个i=2开始,从新计算num,然后跟result比价大小。

二、参考代码暴力法:

class Solution { 
暴力法:  
  public int maxSubArray(int[] nums) {    
      int num =Integer.MIN_VALUE;     
         for(int i =0;i<nums.length;i++){            
         int result =0;         
            int j =i;            
            while(j<nums.length){           
                 result += nums[j];          
                       num=result>num?result:num;                j++;                }        }       
                        return num;    }}```
贪心算法
```java
class Solution {
//         贪心算法
//  如果连续和为负数了 那么记下此时的为0前的值 从下一个开始从新计数,通过比较下一个区间的和,然后判断    public int maxSubArray(int[] nums) {     
   int result = Integer.MIN_VALUE;     
      int num = 0;      
        for(int i =0;i<nums.length;i++){          
          num += nums[i];         
             if(num>result){            
                 result = num;            }         
                    if(num<0){                num =0;            }        }        return result;    }}```
以上分析,希望对您有所帮助,您的支持是我最大的动力,感谢一键三连!!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万物皆可der

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值