子陣列求和

2021-08-21 06:33:28 字數 2403 閱讀 2312

乙個面試題,哎

/**

* 題目:連續子陣列求和

* 給定乙個整數陣列,請找出所有的連續子陣列,計算所有的子陣列的和,輸出子陣列和相加的結果。

** 例如:

* 陣列 [1, 3, 7]有7個子陣列:

* [1] [3] [7] [1,3] [3,7] [1,3,7]

* 子陣列相加後的結果是36

* [ ] + [1] + [3] + [7] + [1, 3] + [3, 7] + [1, 3, 7] = 0 + 1 + 3 + 7 + 4 + 10 + 11 = 36

** 演算法實現在sumarray函式,要求演算法複雜度至少o(n*n*n), 最好o(n)。

*/

最壞的演算法,把所有的字陣列求出來,然後加和,求所有子陣列時間複雜度度,o(n*n), 字陣列求和o(n*n*n)

考慮每個元素在多少個字陣列中出現。陣列中的第i個元素,可以出現在所有長度的字陣列中,判斷在每個長度子陣列中出現的次數。演算法array_sum1.

時間複雜度o(n*n)

每個元素一定出現在乙個子陣列中,並且會把這個陣列分為兩節,前半截的可能性*後半截的可能性,就是包含此元素的所有的可能的子陣列個數。就是演算法3。前半截必須連續和當前元素連起來。演算法array_sum2

時間複雜度o(n)

/**

* 題目:子陣列求和

* 給定乙個整數陣列,請找出所有的子陣列,計算所有的子陣列的和,輸出子陣列和相加的結果。

** 例如:

* 陣列 [1, 3, 7]有7個子陣列:

* [1] [3] [7] [1,3] [3,7] [1,7] [1,3,7]

* 子陣列相加後的結果是36

* [ ] + [1] + [3] + [7] + [1, 3] + [3, 7] +[1,7]+ [1, 3, 7] = 0 + 1 + 3 + 7 + 4 + 10 + 8 + 11 = 44

** 演算法實現在sumarray函式,要求演算法複雜度至少o(n*n*n), 最好o(n)。

*/

直覺方面,每個元素出現的次數和資料長度相關,原以為每個元素出現次數相等(其實錯了),和陣列長度有關。

最壞的演算法,把所有的字陣列求出來,然後加和,求所有子陣列時間複雜度度,o(n*n), 字陣列求和o(n*n*n)

考慮每個元素在多少個字陣列中出現。陣列中的第i個元素,可以出現在所有長度的字陣列中,判斷在每個長度子陣列中出現的次數。沒有實現

時間複雜度o(n*n)

每個元素一定出現在乙個子陣列中,並且會把這個陣列分為兩節,前半截的可能性*後半截的可能性,就是包含此元素的所有的可能的子陣列個數。就是演算法3。不過前半截可以是不連續的,就是2的階乘了,演算法array_sum3

時間複雜度o(n)

#include 

using

namespace

std;

// continue sub array

// time complexity:o(n * n)

int array_sum1(int *a, int len)

// a[i]'s biggest subscript in sub array

int end = j - 1;

if (i < j - 1)

sum += a[i] * (end - begin + 1);}}

return sum;

}// continue sub array

// time complexity:o(n)

int array_sum2(int *a, int len)

return sum;

}// not continue sub array

// time complexity:o(n)

int array_sum3(int *a, int len)

return sum;

}int main() ;

std::cout

<< array_sum1(a, 3) << std::endl;

std::cout

<< array_sum2(a, 3) << std::endl;

std::cout

<< array_sum3(a, 3) << std::endl;

return

0;}

lintcode迴圈陣列之連續子陣列求和

v 題目 連續子陣列求和 ii 給定乙個整數迴圈陣列 頭尾相接 請找出乙個連續的子陣列,使得該子陣列的和最大。輸出答案時,請分別返回第乙個數字和最後乙個數字的值。如果多個答案,請返回其中任意乙個。v 樣例 給定 3,1,100,3,4 返回 4,0 v 思路 1.如果不是迴圈陣列,求解連續子區間和的...

LintCode解題筆記 連續子陣列求和

給定乙個整數陣列,請找出乙個連續子陣列,使得該子陣列的和最大。輸出答案時,請分別返回第乙個數字和最後乙個數字的值。如果兩個相同的答案,請返回其中任意乙個 樣例 給定 3,1,3,3,4 返回 1,4 分析 使用start和end來定位a中最大子陣列開始和結束的位置 方法一 暴力遍歷的方式,兩層for...

子矩陣求和

給出乙個m n的矩陣a,矩陣元素ai,j小於1000,進行q次查詢,每次查詢給出子矩陣的4個邊界 上下左右 求該子矩陣所有元素之和。樣例中第乙個查詢 1 3 1 2 表示從第1行到第3行,從第1列到第2列,對應的子矩陣是 1 25 6 9 10 求和等於33 第一行2個整數n,m,中間用空格分割,分...