zoukankan      html  css  js  c++  java
  • IT公司100题-3-求数组的最大子序列的和

    问题描述:
    输入一个整形数组,数组里有正数也有负数。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。
    例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2
    因此输出为该子数组的和18。
     分析:
    最直接的方法就是找出所有的子数组,然后求其和,取最大。如果每个子数组都遍历求和,该方法的复杂度为O(N^3)。
     

    时间复杂度O(n)的实现代码,如下所示:

     1 // 3.cc
     2 #include <iostream>
     3 using namespace std;
     4 
     5 // 求子数组连续最大和
     6 int max_sub_sum(int* a, int n) {
     7       int sum = a[n - 1];
     8       int start = a[n - 1];
     9       for(int i = n - 2; i >= 0; i--) {
    10             start = max(start + a[i], a[i]);
    11             sum = max(sum, start);
    12       }
    13       return sum;
    14 }
    15 
    16 int main() {
    17       int a[7] = {-2, 5, 3, -6, 4, -8, 6};
    18       int max_sub = max_sub_sum(a, 7);
    19       cout << "max sub sum is: " << max_sub << endl;
    20 }
  • 相关阅读:
    queue
    hiho1095(二分)
    uvaliva3942(trie树)
    hiho1014(trie树)
    uvalive4329(树状数组)
    Dropping tests POJ
    linux mysql命令
    linux文件系统和mount(硬盘,win分区,光驱,U盘)
    linux共享windows资料
    linux常用命令
  • 原文地址:https://www.cnblogs.com/dracohan/p/3873766.html
Copyright © 2011-2022 走看看