最大连续子数组

给定一个数组,求数组的最大连续子数组,使得该子数组的和最大

暴力法

直接先上代码

function maxSubarray(arr) {let maxSum = arr[0]let startIndex = 0let endIndex = 0for (let i = 0; i < arr.length; i++) {for (let j = i; j < arr.length; j++) {let currSum = 0for (let k = i; k <= j; k++) {currSum += arr[k]}if (currSum > maxSum) {# 记录下标maxSum = currSumstartIndex = iendIndex = j}}}return [arr.slice(startIndex,endIndex+1),maxSum]
}

思路:

暴力法直接通过两次嵌套的循环确定连续子数组的开始下标和结束下标,其中开始下标范围是[0,arr.length-1],结束下标范围是大于等于开始下标,小于等于arr.length-1,确定好开始下标和结束下标之后,通过循环将这个下标范围内的每一项相加,得到连续子数组的和,这里需要得到最大的和,所以需要定义一个初始最大和,这个和不能不定义,也不能直接定义为0,理论上需要定义成arr任意一个连续子数组的和,在这里定义成arr[0],为了输出这个字数组,还需要记录和最大时的开始下标和结束下标,最后输出结果.
此方法的时间复杂度:
三次循环嵌套,则O(n)=n^3

分治法

function maxSubarray(arr,indexStrat = 0) {# 回调出口if (arr.length == 1) {return arr[0]}# 取一个数组的中间值let middle = Math.ceil((arr.length - 1) / 2)# 最大和在左边数组let max1 = maxSubarray(arr.slice(0, middle))# console.log(arr.slice(0, middle));# 最大和在右边数组let max2 = maxSubarray(arr.slice(middle),middle)# 最大和跨立在中间值上# 定义左侧初始最大和let leftMax = arr[middle - 1]# 定义当前和为中间值let now = arr[middle - 1]# 记录起始下标let startIndex = middle - 1# 记录结束下标 let endIndex = middle# 循环往前累加每一项,每次和最大和比较,如果大于最大值就将当前和保存到左侧最大和for (let i = middle - 2; i >= 0; i--) {now += arr[i]if (now > leftMax) {leftMax = nowstartIndex = i}}# 定义右侧初始最大和 let rightMax = arr[middle]# 赋值当前和now = arr[middle]for (let i = middle + 1; i < arr.length; i++) {now += arr[i]if (now > rightMax) {rightMax = nowendIndex = i}}let max3 = [leftMax + rightMax,arr.slice(startIndex,endIndex+1)]return Math.max(max1, max2, max3[0])
}

思路:
先定义一个中间值,最大连续子数组的和最大有三种情况:
1.在中间值的左侧
2.在中间值的右侧
3.跨立在中间值上
其中左侧和右侧继续调用函数自身,此方法是一个递归函数,输出最大和
时间复杂度:O(nlogn)

T(n) = 2*T(n/2) + cn= 2*(2*(n/4) + c*(n/2)) + cn = 4*T(n/4) + 2cn= 4*(2*T(n/8) + c*(n/4)) + 2cn = 8*T(n/8) + 3cn= 8*(2*T(n/16) + c*(n/8)) + 3cn = 16*T(n/16) + 4cn...= 2^k*T(n/2^k) + kcn
# 若 n = 2^k
T(n) = n*T(1) + n*log2(n)*c

分析法

思路:
这个方法通过增加了空间复杂度换取时间复杂度,将算法的时间复杂度降低到O(n)
首先,连续子数组的和有一个规律,比如arr的i-j下标范围的子数组和为前j项和减去前i项和,根据这个规律
1.第一个循环遍历求出前i项和,保存在一个新的数组里
2.第二次遍历新数组,找到当前元素前面元素的最小值,用当前元素减去这个最小值,得到一个最大子数组和,循环遍历,记录最大的一个
同样,此方法也未能找到记录下标的方式

给定一个数组,求数组的最大连续子数组,使得该子数组的和最大相关推荐

  1. 牛客网:乘积为正数的最长连续子数组

    1.非环形 注意审题!! 这里是求连续最长乘积为正数的长度是多少,我们维护两个长度,一个pos一个neg,pos代表到当前这个数为止的最长正数乘积,neg代表到当前这个数为止的最长负数乘积,我们对每个 ...

  2. python求最大连续子数组

    寻找最大子数组问题: 给定数组A:寻找A中的和最大的非空连续子数组.我们称这样的连续子数组为最大子数组(maximum subarray) 1.暴力求解:两个循环,时间复杂度为O(n^2) 2.用分治 ...

  3. 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。

    笔者初涉<算法设计与分析>这门专业课,在做一些算法设计题的过程中遇到一些小感悟,特此记录和大家分享. 下面直接给出算法题目: 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高 ...

  4. 算法学习-零子数组,最大连续子数组

    题目 对于长度为N的数组A,求连续子数组的和最接近0的值. 如: 数组A:1,-2,3,10,-4,7,2,-5 它是所有子数组中,和最接近0的是哪个? 算法流程 申请比A长1的空间sum[-1,0, ...

  5. LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)

    581. 最短无序连续子数组 581. Shortest Unsorted Continuous Subarray 题目描述 给定一个整型数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序 ...

  6. sscanf 连续相同编辑符_基于单调栈的滑动窗口法求解“和至少为 K 的最短连续子数组”...

    题目解读 题目要求我们给出一个最短的连续子数组,且这个子数组的和要大于等于 K.乍一看,除了暴力,似乎没什么思路.由于数组规模为 50000,暴力肯定会超时的.但是,我们还是要先暴力一把,看看有什么灵 ...

  7. Leetcode 581.最短无序连续子数组

    最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: [2, ...

  8. 581. 最短无序连续子数组

    给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 请你找出符合题意的 最短 子数组,并输出它的长度. 示例 1: 输入:nums ...

  9. 查找数组连成环形的和最大的连续子数组

    思路: 把每一种起点情况下的最大子数组之和S求出,存入S[]数组中,最后比较S[]中的最大值(i为数组的长度)存为MaxSum.而此时的起点-finalStart和终点-finalEnd也同样可以在求 ...

  10. java 求最长重复子串_给定一个字符串,求出其最长的重复子串。

    #include #include #include #include using namespace std; //给定一个字符串,求出其最长的重复子串 //方法一 string lsubstr_1 ...

最新文章

  1. 手工接口测试考虑的点
  2. eeglab中文教程系列(6)-数据叠加平均{1}(Data averaging)
  3. WINCE6.0支持Multiple XIP
  4. eclipse使用tomcat进行部署时编译代码不一致的处理
  5. 0x00000000 处有未经处理的异常: 0xC0000005: 在位置 0x0000000000000000 发生访问冲突
  6. 计算机英语阅读理解,2017年12月英语四级阅读理解50篇:学习计算机
  7. leetcode 1631. 最小体力消耗路径(并查集)
  8. Python发送文本邮件
  9. x5内核有什么优点_接上U盘就是NAS私有云,蒲公英X5入手测评
  10. 【响应式编程的思维艺术】 (4)从打飞机游戏理解并发与流的融合
  11. oracle 12.1.0.2中对象锁对系统的较大影响
  12. 基于OMAP-L138 DSP+ARM处理器与FPGA实现SDR软件无线电系统
  13. oracle分页优化
  14. 什么是数据分析,主要有什么目的,数据分析的处理流程是什么?
  15. 智慧城市同城小程序V4_1.0.86后端+双前端
  16. 如何使用ContentProvider打造自己的本地图片库
  17. 数据分析统计学原理第十二章:多个比例的比较、独立性及拟合优度检验 | 我的统计学原理复习日记
  18. 用css实现各种导航栏
  19. win10设置任务栏图标长短
  20. Coda 2.7.7 强大的Web编辑器

热门文章

  1. 在波点音乐听周杰伦新歌专辑,一起“用音乐穿越”
  2. OSChina 周六乱弹 —— 飞机上飞离太阳那么近晒黑了不是很正常吗
  3. 桌面上的计算机图标是一个,电脑桌面上计算机图标不见如何找回
  4. 我终于有自己的专业技术博客了
  5. 风潮唱片总目录及下载地址-2009年2月9日更新
  6. 倒计时器 (WPF)
  7. 平安人寿御享福,新噪点新优势
  8. codeforces 1183H 动态规划
  9. 计算机主板运算放大器电路,常用运算放大器电路图 (全集)
  10. 网络故障排除的五个简单步骤