【面试】求数组子序列的最大和

原文地址:http://www.cnblogs.com/bigwangdi/p/3139598.html

一、问题描述

输入一个整形数组,数组里可以有正数或负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。

第一次遇到这道题是参加x迅的笔试。题目中给出了两种解法,让填空。

二、简单解

拿到这道题,如果不考虑性能和复杂度,最简单的方法就是穷举。穷举出所有的子数组,并求出他们的和,返回最大值。不过,复杂度为O(n3),不符合题目的要求(复杂度On)

int max_sum(int *arr, int len){  int max, sum;  for(int i = 0; i < len; i++) {  for(int j = i; j < len; j++) {  sum = 0;  for(int k = i; k <= j; k++) {  sum = sum + arr[k];  if(sum > max) {  max = sum;  }  }  }  }  if(max == 0) {  return max(arr, len);  }  return max;
}  

三、复杂度为N2的解

观察上面的代码,我们使用了3个for循环。其中最内侧的for循环主要是控制每个字序列的长度,由于我们在计算的过程中,已经保存了当前最大字序列和,字序列的长度N对我们来说意义不大,因此完全可以撤消最内侧的循环。只按每个字序列起始位置来计算最大和。这样得到一个复杂度为N2的解。

int max_sum2(int *arr, int len){  int sum, max = 0;  for(int i = 0; i < len; i++) {  sum = 0;  for(int j = i; j < len; j++) {  sum = sum + arr[j];  if(max < sum) {  max = sum;  }  }  }  if(max == 0) {  return max(arr, len);  }  return max;
}  

四、更低复杂度的探索

 
至此,我们已经得到一个复杂度为N2的解法。那么有没有更低复杂度的算法呢?在N2的算法中,我们遍历了从0到len-1开始的字序列,求出每种情况下得到的最大字序列和。那么我们有没有可能去掉这个循环呢?考虑使用动态规划的思想,记max_sum[i]为从0到i的子序列的最大和,那么可以得到递推式:
if max_sum[i] > 0
then    if arr[i+1] > 0    then max_sum[i+1] = max_sum[i] + arr[i+1];
else    max_sum[i+1] = max(0, arr[i+1])   

利用这种思路得到一个线性时间的解答:

int max_sum3(int *arr, int len) {  int sum, max;  max = sum = 0;  for(int i = 0; i < len; i++) {  sum += arr[i];  if(sum < 0) {  sum = 0;  }  if(sum > max){  max = sum;  }  }  if(max == 0) {  return max(arr, len);  }  return max;
}  

至此,我们得到一个时间复杂度On,空间复杂度O1的解。

转载于:https://www.cnblogs.com/zhousan/p/3140846.html

【面试】求数组子序列的最大和相关推荐

  1. 1.19 实例:Java求数组元素的最大和最小值

    本节通过求数组的最大和最小值来提高初学者对数组的一些基本应用. public class Example{public static void main(String[] args) {int sco ...

  2. Java求数组元素的最大和最小值

    求数组的最大和最小值 public class Example{public static void main(String[] args) {int score[] = { 67, 89, 87, ...

  3. 程序员面试100题之九:求子数组的最大和

    题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, ...

  4. android 求数组最大值,面试算法知识梳理(7) - 数组第四部分

    面试算法代码知识梳理系列 一.概要 本文介绍了有关数组的算法第四部分的Java代码实现,所有代码均可通过 在线编译器 直接运行,算法目录: 求数组当中的最长递增子序列(求数组当中的最长递减子序列) 区 ...

  5. php取数组中连续数,PHP实现求连续子数组最大和问题2种解决方法

    本文实例讲述了PHP实现求连续子数组最大和问题2种解决方法.分享给大家供大家参考,具体如下: 问题描述 求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整 ...

  6. 《github一天一道算法题》:分治法求数组最大连续子序列和

    看书.思考.写代码. /**************************************** copyright@hustyangju * blog: http://blog.csdn.n ...

  7. 【Py面试题】找到数组或整数列表中连续子序列的最大和

    测试面试题 找到数组或整数列表中连续子序列的最大和 找到数组或整数列表中连续子序列的最大和,并满足以下条件: 列表仅由正数组成并且最大和是整个数组的总和. 如果列表仅由负数组成,则返回 0 空列表被认 ...

  8. 求数组中最长连续递增子序列

    求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入 ...

  9. 求数组中最长递增子序列的长度

    题目:写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 例:在序列[1, -1, 2, -3, 4, -5, 6, -7]中,其最长递增子序列的长度为4([1, 2, ...

  10. 求数组中和为给定值的所有子序列

    package com.zxt.algorithm;import java.util.ArrayList; import java.util.Arrays;/*** 求数组中和为给定值的所有子序列* ...

最新文章

  1. NLP通用模型诞生?一个模型搞定十大自然语言常见任务
  2. hosts文件连接服务器失败,ssh连接远程服务器出现Host key验证失败的解决方案
  3. 手写汉字笔迹识别模型汇总
  4. BootStrap入门教程 (四)
  5. mysql查询字符串出现次数
  6. crontab文件在哪个目录_目录形式URL与文件形式URL哪个更有利于SEO
  7. 格式化输出浮点型变量
  8. 前端为什么要使用组件化的思想,通过一个实例来分析
  9. SAP CRM WebClient UI 培训教程
  10. 迷宫游戏c语言代码讲解,迷宫游戏C语言代码讲解.doc
  11. qt widget 窗口句柄的问题
  12. 轻量级PHP接口框架PhalApi开源接口框架 v2.17.1源码
  13. 年轻人千万不要学什么管理
  14. setTimeout.js
  15. px upx 和rpx
  16. 深澜系统服务器架构,S7510E-X结合深澜服务器做Portal无感知认证终端不定时掉线经验案例...
  17. 坚守普惠金融初心,微众银行持续升级无障碍金融服务
  18. 全球开发者各出奇招:我们想这样适配iPhone X
  19. 仿微信九宫格群聊view
  20. 写给产品经理的12封信(第07封:学习能力)

热门文章

  1. IDEA 常用快捷键 常用插件 2
  2. linux [CTRL]+c与[CTRL]+d
  3. 轻松学习java可重入锁(ReentrantLock)的实现原理
  4. 第十八次ScrumMeeting博客
  5. CSS3 Transform 变形
  6. child-selector解释
  7. web 前端小记_1 :hasLayout
  8. SUBSTRING_INDEX
  9. java中String字符串
  10. c#textBox控件限制只允许输入数字及小数点