『LeetCode|每日一题』---->连续数列

目录

每日一句

作者简介  

 『LeetCode|每日一题』 连续数列

1.每日一题

2.解题思路 (方法一)

        2.1 思路分析

        2.2 核心代码

         2.3 全部代码

        2.4 运行结果

3.解题思路(方法二)

        3.1 思路分析 

        3.2 核心代码 

        3.3 全部代码

        3.4 运行结果


每日一句

爬上山顶并不是为了让全世界看到你,而是让你看到全世界

作者简介  

🏡个人主页:XiaoChen_Android

📚学习专栏:力扣专栏

🕒发布日期:2022/8/19

在这里插入图片描述

 『LeetCode|每日一题』 连续数列

1.每日一题

原文链接--->快点我

2.解题思路 (方法一)

        2.1 思路分析

此题其实就是动态规划中的最大子段和,第一种方法空间复杂度为O(1),第二种方法空间复杂度为O(n)

        S1:对于此题,我们只要考虑当前元素nums[i]是否要加入到前一段nums(0,i - 1)中;

        S2:第一种情况,sum + nums[i] <= nums[i],sum为前一段字段和,此时说明sum是小于等于0的,前一段我们不要,所以此时sum应赋值为nums[i];

        S3:第二种情况,sum + nums[i] > nums[i],此时说明sum大于0,前一段和对我们有好处(可以增加字段和),所以字段和应更新为nums[i] + sum;

        S4:如果算出来的sum比刚开始的maxsum大,那么此时的最大字段和应为sum

        2.2 核心代码

        for(int i = 1 ; i < nums.length ; i ++){
            if(sum + nums[i] <= nums[i]){
                sum = nums[i];
            }else {
                sum = sum + nums[i];
            }
            if(sum > maxsum){
                maxsum = sum;
            }
        }

         2.3 全部代码

class Solution {
    public int maxSubArray(int[] nums) {
        if(nums.length == 1) return nums[0];
        int maxsum = nums[0];
        int sum = nums[0];
        for(int i = 1 ; i < nums.length ; i ++){
            if(sum + nums[i] <= nums[i]){
                sum = nums[i];
            }else {
                sum = sum + nums[i];
            }
            if(sum > maxsum){
                maxsum = sum;
            }
        }
        return maxsum;
    }
    
}

        2.4 运行结果

3.解题思路(方法二)

        3.1 思路分析 

        S1:定义一个新数组来存从开始到该位置的字段和,定义一个变量来存最大字段和,首先新数组b[0] = nums[0]且maxsum = nums[0];

        S2:从第二个元素开始遍历如果到前一个元素的字段和大于零,那么此时b[i]应该为前面所有元素的字段和加上当前位置的元素,即b[i] = b[i - 1] + nums[i];

        S3:如果前面所有位置的字段和小于0,那么此时b[i]应该为当前元素值,即b[i] = nums[i];

        S4:最后只需要判断maxsum和最大字段和的大小,取其中大的即可

        3.2 核心代码 

    private static int dtgh(int n , int[] nums){
        int[] b = new int[n];
        b[0] = nums[0];
        int maxsum = b[0];
        for(int i = 1 ; i < n ; i ++){
            if(b[i - 1] > 0){
                b[i] = b[i - 1] + nums[i];
            }else {
                b[i] = nums[i];
            }
            if(b[i] > maxsum){
                maxsum = b[i];
            }
        }
        return maxsum;

    }

        3.3 全部代码

class Solution {
    public int maxSubArray(int[] nums) {
        if(nums.length == 1) return nums[0];
        int ans = 0;
        int n = nums.length;
        ans = dtgh(n , nums);
        return ans;
    }
    private static int dtgh(int n , int[] nums){
        int[] b = new int[n];
        b[0] = nums[0];
        int maxsum = b[0];
        for(int i = 1 ; i < n ; i ++){
            if(b[i - 1] > 0){
                b[i] = b[i - 1] + nums[i];
            }else {
                b[i] = nums[i];
            }
            if(b[i] > maxsum){
                maxsum = b[i];
            }
        }
        return maxsum;

    }
    
}

        3.4 运行结果


 🍁 类似题目推荐:

1.剑指offer专项练习 

2.算法专项练习 

3.推荐一个学习网站:LeetCode,算法的提升在于日积月累,只有每天练习才能保持良好的状态

如果文章对你有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教! 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值