LeetCode小白菜笔记[13]:Maximum Subarray

2024-01-28 14:40

本文主要是介绍LeetCode小白菜笔记[13]:Maximum Subarray,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeetCode小白菜笔记[13]:Maximum Subarray

53. Maximum Subarray [easy]

题目如下:

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

More practice:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

这个题目是一个灰常经典的算法问题,就是最大子序列和问题,经常被包装成很多实际问题,比如股票价格变动已知的情况下何时买入何时出手能获得最大收益。有很多解法,分别具有不同的复杂度,从O(n^3),O(n^2)到O(nlogn)以及O(n)都有,而且动态规划,分治算法都有应用。回去后在算法一栏中单独整理这个典型问题。现在只考虑用一种O(n)的算法来实现。

code如下:

class Solution(object):def maxSubArray(self, nums):""":type nums: List[int]:rtype: int"""thismax = 0globalmax = nums[0]for i in range(len(nums)):if thismax > 0:thismax += nums[i]else:thismax = nums[i]if thismax > globalmax:globalmax = thismaxreturn globalmax

基本思路如下:考虑一个数列,如果要找到最长子序列,可以遍历所有的子序列,然后每个子序列求和,比较大小,这样的话就是立方时间O(n^3)。这显然是不能接受的,于是考虑这个问题的最终结果具有哪些特性,从而可以略过一些循环。首先考虑到的是,对于最大和子序列来说,它的前缀,即第一个元素肯定不会是负数,因为如果前缀是负数,那么去掉前缀的一定比现有的大。所以可以在所有的遍历中,略过那些负数开始的序列。以这种思路继续延伸,我们发现:任何负的子序列也不是最优子序列的前缀,因为去掉它们会更优。所以我们维护一个thismax,也维护一个globalmax,globalmax就是最优解,而thismax指的是以某个位置的数字为后缀的子序列的最大值,循环到第i个数的时候,如果前面的子序列是正的,那么以第i个数为结尾的最大子序列,也就是此时的thismax,要保留前面的并且更新thismax = thismax + nums[i]。如果前面是负的,那么thismax就更新成nums[i],然后每次都和globalmax比较,大于的话就更相信globalmax。最后返回globalmax就是最终结果,时间复杂度为线性O(n)。而且是常数空间,一颗赛艇~


这里写图片描述

2018年2月9日16:45:50

腊月二十四 小年快乐~(虽然我们过二十三)

这篇关于LeetCode小白菜笔记[13]:Maximum Subarray的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/653940

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return