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

原文地址: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. 解决 The mysql extension is deprecated and will be r
  2. C# SQLiteHelper类似SqlHelper类实现存取Sqlite数据库
  3. MySQL数据库have_openss_MySQL 关于OpenSSL证书支持检查方式
  4. SAP QM Quality Notification的凭证流
  5. Windows 系统下Git安装图解
  6. 详解C语言中 # 和 ## 的用法
  7. 打开excel文件并写入_双击Excel表格文件时只打开程序不能直接打开文件
  8. eclipse 3.7安装扩展心得
  9. 解决React Native unable to load script from assets index.android.bundle on windows
  10. 菜鸟学习笔记:Java提升篇3(容器3——泛型、排序)
  11. WinLicense下载购买地址
  12. 林语堂:读书须有胆识,有眼光,有毅力
  13. [示例代码]植物大战僵尸网页版
  14. 经典文章:一位营销总监的辞职信及回复
  15. 全球首推语音定制产品,百度地图背后的语音技术到底有多强大?
  16. 各位师兄妹,来刷腾讯了,好多经验...
  17. openfalcon 组件监控_使用滴滴云快速搭建 Open-Falcon 监控平台
  18. 2019 Revit二次开发企业
  19. 用图灵机器人2.0实现聊天机器人
  20. asn1编码格式的解析过程

热门文章

  1. VMware 虚拟机安装 CentOS 7.2 系统
  2. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第5节 使用骨架创建maven的java工程_16maven工程servlet实例之jar包冲突...
  3. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第2节 TCP协议_2_TCP通信的概述(下)...
  4. JVM学习笔记四_垃圾收集器与内存分配策略
  5. Nginx + keepalived 实现高可用
  6. 基于Extjs+SpringMVC+MyBatis+Oracle的B/S信息系统简化开发思路
  7. NSLog的各种打印格式
  8. 如何在ADO中使用数据读取器(DataReader)读取数据
  9. ant gradle curl等工具原理以及使用记录
  10. 每天学一点Linux(一)——apt-get