leetcode hot100刷题日记——7.最大子数组和

在这里插入图片描述

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        //方法一:动态规划
        //dp[i]表示以i下标结尾的数组的最大子数组和
        //那么在i=0时,dp[0]=nums[0]
        //之后要考虑的就是我们要不要把下一个数加进来,如果下一个数加进来会使结果变大那就加进来
        //但要是下一个数加进来之后,还不如这个数单独大,那我们就舍弃前面的子数组和,直接用单独这个数,即:
        //dp[i]=max(dp[i-1]+nums[i],nums[i])
        //什么情况下“下一个数加进来之后,还不如这个数单独大”?
        //dp[i-1]为负数的时候
        // int n=nums.size();
        // vector<int>dp(n);
        // dp[0]=nums[0];
        // int maxx=nums[0];
        // for(int i=1;i<n;i++){
        //     dp[i]=max(dp[i-1],0)+nums[i];
        //     maxx=max(dp[i],maxx);
        // }
        // return maxx;

    //方法2:前缀和+贪心
    //最大子数组和=max(所有当前前缀和-最小前缀和)
    //为什么只需要维护最小前缀和呢?
    //因为最大子数组和这个问题要看的是连续部分!
    //你如果求最大前缀和-最小前缀和
    //那么有可能最大前缀和比最小前缀和短!
    //eg. 5 4 3 -2 -1 -5
    //最大前缀和是5+4+3=12
    //最小前缀和是5+4+3-2-1-5=4
    //最大前缀和-最小前缀和=8
    //但是不对啊!实际上最大子数组和是5+4+3=12啊!
    //所以最小前缀和初始化值为0
    int n=nums.size();
    if(n==1)
        return nums[0];
    int ans=INT_MIN;
    int minn=0;
    int sum=0;
    for(int i=0;i<n;i++){
        sum+=nums[i];
        ans=max(ans,sum-minn);
        minn=min(minn,sum);
    }
    return ans;

    }
};

时间复杂度:O(N)
空间复杂度:
方法一是O(N)
方法二是O(1)

### LeetCode Hot100 技巧与策略 LeetCodeHot100 是许多程序员提升算法能力的重要资源之一。以下是针对该部分的一些技巧策略: #### 1. **制定合理的计划** - 推荐按照一定的顺序进行,例如优先完成热 HOT 100 精选 TOP 面试[^1]。这些目覆盖了大部分常见的算法知识点技术面试考点。 - 将目按难度分类(简单、中等、困难),逐步攻克不同层次的挑战。 #### 2. **利用辅助工具提高效率** - 借助公子龙大佬开发的网站及其插件功能[^2],可以更高效地查找解思路并学习经典算法框架。 - 插件能够帮助用户快速定位到某类问的核心解决方法,减少无谓的时间浪费。 #### 3. **注重总结归纳** - 对于每一道做过的目,都应该尝试分析其背后的通用模式以及可能的变化形式[^4]。比如环形链表的相关变种问(如回文链表)往往具有相似逻辑结构。 - 定期整理笔记,记录下自己容易遗忘的知识点或者巧妙的解决方案。 #### 4. **模拟真实场景训练** - 如果目标是为了准备技术面试,则建议模仿实际考试环境来进行限时答练习[^5]。这样不仅可以锻炼思维敏捷度还能增强抗压能力。 - 同时也要关注时间复杂度空间复杂度优化等方面的要求。 #### 5. **积极参与社区讨论** - 加入像寸铁这样的优质创作者所创建的学习小组或论坛,与其他志同道合者共同探讨难解答方案。 - 学习他人优秀的思维方式有助于拓宽视野开阔眼界。 下面提供一段简单的 Python 实现代码作为例子展示如何处理其中一类常见数据结构——链表的操作: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def hasCycle(head: ListNode) -> bool: slow = fast = head while fast and fast.next: slow = slow.next # Move one step at a time. fast = fast.next.next # Move two steps at once. if slow == fast: # If there's an intersection point found. return True return False # No cycle detected after traversal completes. ``` 此函数用于检测单向链表是否存在闭环现象,采用双指针法实现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值