持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。
题目(已做删减处理)
已知子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,若对所有 i(l <= i < r),numsi < numsi+1 都成立,则称这一子数组为 升序 子数组。注意,大小为 1 的子数组也视作 升序 子数组。
分析
今天的文章中,并不会涉及代码方面的知识。因为今天的题目实在是太简单了,稍微了解动态规划,或者是算法的新人,也能够很容ac。今天我们分析的题目,是力扣上的一道简单的动态规划题目。从题目中得到两个关键点:一是要是升序的子数组;另一个是和最大。我们可以这么分析: 假设 dp是当前的和,可以得出这样的判断(不考虑边界问题,即 i>0):
- 当 nums[i]>nums[i-1] 时,有:
dp = dp[i-1]+nums[i];
- 当 nums[i]<nums[i-1] or nums[i] ==nums[i-1] 时,有:
dp = nums[i];
除了常见的上面两种情况,我们也要分析一下边界的时候,即i=0的时候。这个时候我们简单的赋值 dp=nums[0] 即可。 通过上述的分析,我们就很容易的得出对应的代码。无非是以下的流程:遍历数组,如果当期值小于后一期的值,则进行相加,否则进行判断。最后返回最大值即可。
总结
一道及其典型的动态规划题目,可以作为算法新人刷题提升信息的题目。和我们面试或者是笔试中的动态规划题目不同,这道题目可以说直接对同学们提示了知识点。有一说一,这种动态规划题目,在算法初期,可以很好地提高新人对于相关知识点的掌握程度,不用考虑复杂的,或者是掺杂其他知识点。很不错的easy算法题。