乙個面試題,哎
/**
* 題目:連續子陣列求和
* 給定乙個整數陣列,請找出所有的連續子陣列,計算所有的子陣列的和,輸出子陣列和相加的結果。
** 例如:
* 陣列 [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,中間用空格分割,分...